ZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5jbGFzc3BhdGggYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFlZWE4Li4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3VpdGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLnByb2plY3QgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxOTI2Yy4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ4MmYyLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBOb3YgMTkgMTM6NTA6NTkgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhNWRkZi4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iMy44LjEiLAotIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5yZHQudWk7YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5jZHQudWkudGVzdHM7YnVuZGxlLXZlcnNpb249IjUuMC4yIiwKLSBvcmcuZWNsaXBzZS5jZHQudWk7YnVuZGxlLXZlcnNpb249IjUuMC4yIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzO2J1bmRsZS12ZXJzaW9uPSIxLjAuMSIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmU7YnVuZGxlLXZlcnNpb249IjUuMC4yIiwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iNS4wLjEiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjIiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iMy40LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5uYXZpZ2F0aW9uLAotIG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMuc3VpdGUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMuUkRUVUlUZXN0UGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnVpLnBhcnQKZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU2YWNjLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gdGVzdC8sXAotICAgICAgICAgICBzdWl0ZS8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuYyBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzYjUzZC4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9maXh0dXJlcy9uYXZpZ2F0aW9uX3Rlc3RfcHJvamVjdC90ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNpbXBvcnQgInRlc3QuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuaCBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL2ZpeHR1cmVzL25hdmlnYXRpb25fdGVzdF9wcm9qZWN0L3Rlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9maXh0dXJlcy9uYXZpZ2F0aW9uX3Rlc3RfcHJvamVjdC90ZXN0LmgKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9SRFRVSVRlc3RQbHVnaW4uamF2YSBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvUkRUVUlUZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yzc3YzYuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvc3VpdGUvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9SRFRVSVRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUkRUVUlUZXN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBSRFRVSVRlc3RQbHVnaW4gcGx1Z2luOwotCQotCXB1YmxpYyBSRFRVSVRlc3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSRFRVSVRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9zdWl0ZS9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL3N1aXRlL1VJQmFzaWNUZXN0U3VpdGUuamF2YSBiL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlCYXNpY1Rlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc2MjYwLi4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlCYXNpY1Rlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMuc3VpdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotCi0vKioKLSAqIFRlc3RzIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFVJQmFzaWNUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFVJQmFzaWNUZXN0U3VpdGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gVE9ETyBhZGQgc29tZSB0ZXN0cwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlDb25uZWN0aW9uVGVzdFN1aXRlLmphdmEgYi9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy9zdWl0ZS9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL3N1aXRlL1VJQ29ubmVjdGlvblRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQ2OGI3Li4wMDAwMDAwCi0tLSBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3N1aXRlL29yZy9lY2xpcHNlL3B0cC9yZHQvdWkvdGVzdHMvc3VpdGUvVUlDb25uZWN0aW9uVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5zdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJkdC51aS50ZXN0cy5uYXZpZ2F0aW9uLk5hdmlnYXRpb25UZXN0czsKLQotCi0vKioKLSAqIFRlc3RzIHRoYXQgcmVxdWlyZSBhIGNvbm5lY3Rpb24gdG8gYmUgcnVuLAotICogdGhpcyBzdWl0ZSBtdXN0IGJlIGxhdW5jaGVkIGZyb20gYSBDb25uZWN0aW9uU3VpdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUNvbm5lY3Rpb25UZXN0U3VpdGUgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFVJQ29ubmVjdGlvblRlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChOYXZpZ2F0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzL3Rlc3Qvb3JnL2VjbGlwc2UvcHRwL3JkdC91aS90ZXN0cy9uYXZpZ2F0aW9uL05hdmlnYXRpb25UZXN0cy5qYXZhIGIvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvdGVzdC9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL25hdmlnYXRpb24vTmF2aWdhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDJjNzQuLjAwMDAwMDAKLS0tIGEvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQudWkudGVzdHMvdGVzdC9vcmcvZWNsaXBzZS9wdHAvcmR0L3VpL3Rlc3RzL25hdmlnYXRpb24vTmF2aWdhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucmR0LnVpLnRlc3RzLm5hdmlnYXRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuQ0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5pbmRleC5JSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUxhbmd1YWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuQVNUQ2FjaGUuQVNUUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUucGFyc2VyLlBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwudWkuZWRpdG9yLkFTVFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS5lZGl0b3IuQ0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQudWkudGVzdHMudGV4dC5FZGl0b3JUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS50ZXN0cy50ZXh0LnNlbGVjdGlvbi5DUFBTZWxlY3Rpb25UZXN0c0FueUluZGV4ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmludGVybmFsLnJkdC5jb3JlLmluZGV4LlJlbW90ZUZhc3RJbmRleGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5pbnRlcm5hbC5yZHQudWkuc2VhcmNoLmFjdGlvbnMuT3BlbkRlY2xhcmF0aW9uc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHMuQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnRlc3RzLlJlbW90ZVRlc3RQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXMuY29yZS5TZXJ2aWNlTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3I7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQotcHVibGljIGNsYXNzIE5hdmlnYXRpb25UZXN0cyBleHRlbmRzIENQUFNlbGVjdGlvblRlc3RzQW55SW5kZXhlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dBSVRfVElNRSA9IDEyMDAwMDsKLQotCS8qIEkgdGhpbmsgYSBsb3Qgb2YgdGhlIHRlc3RzIHRoYXQgZmFpbCBkbyBzbyBiZWNhdXNlIG9mIHR3byByZWFzb25zOgotCSAqIC0gSGVhZGVycyBhcmUgbm90IGJlaW5nIHNraXBwZWQgYXMgdGhleSBzaG91bGQgYmUsIAotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURVNUU19UT19SVU4gPSB7Ci0JCSJ0ZXN0QnVnOTMyODEiLAotCQkidGVzdEJ1ZzIwNzMyMCIsCi0JCSJ0ZXN0VGVtcGxhdGVDbGFzc01ldGhvZF8yMDczMjAiLAotCQkvLyJ0ZXN0QmFzaWNEZWZpbml0aW9uIiwgLy8gRkFJTCBjYW5ub3QgcmVwcm9kdWNlIGZhaWx1cmUKLQkJInRlc3RCYXNpY1RlbXBsYXRlSW5zdGFuY2VfMjA3MzIwIiwKLQkJInRlc3RCdWc4NjgyOUEiLAotCQkvLyJ0ZXN0Q1BQU3BlY0RlY2xzRGVmcyIsIC8vIEZBSUwgY2Fubm90IHJlcHJvZHVjZSBmYWlsdXJlCi0JCSJ0ZXN0QnVnMTY4NTMzIiwKLQkJInRlc3RCdWc5NTIyNSIsCi0JCS8vInRlc3RCdWc5NTIwMiIsIC8vIEZBSUwsIHNob3VsZCBub3QgZmFpbCB3aGVuIGhlYWRlcnMgYXJlIHNraXBwZWQgcHJvcGVybHkKLQkJInRlc3RCdWcxMDEyODciLAotCQkidGVzdEJ1ZzEwMjI1OCIsCi0JCSJ0ZXN0QnVnMTAzMzIzIiwKLQkJInRlc3RCdWc3ODM1NCIsCi0JCS8vInRlc3RCdWcxMDM2OTciLCAvLyBGQUlMIHRyeWluZyB0byB1c2UgbG9jYWwgcGF0aCB3aGljaCBmYWlscwotCQkvLyJ0ZXN0QnVnMTA4MjAyIiwgLy8gRkFJTAotCQkvLyJ0ZXN0Q05hdmlnYXRpb25JbkNwcFByb2plY3RfYnVnMTgzOTczIiwgLy8gRkFJTAotCQkvLyJ0ZXN0RnVuY1dpdGhUeXBlZGVmRm9yQW5vbnltb3VzU3RydWN0XzE5MDczMCIsIC8vIEZBSUwKLQkJLy8idGVzdEZ1bmNXaXRoVHlwZWRlZkZvckFub255bW91c0VudW1fMTkwNzMwIiwgLy8gRkFJTAotCQkidGVzdE1hY3JvTmF2aWdhdGlvbiIsCi0JCSJ0ZXN0TWFjcm9OYXZpZ2F0aW9uX0J1ZzIwODMwMCIsCi0JCSJ0ZXN0SW5jbHVkZU5hdmlnYXRpb24iLAotCQkvLyJ0ZXN0TmF2aWdhdGlvbkNwcENhbGxzQyIsIC8vIEZBSUwKLQkJLy8idGVzdE5hdmlnYXRpb25DQ2FsbHNDcHAiLCAvLyBGQUlMCi0JCSJ0ZXN0TmF2aWdhdGlvbkluRGVmaW5lZEV4cHJlc3Npb25fMjE1OTA2IiwKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJLy9yZXR1cm4gc3VpdGUoTmF2aWdhdGlvblRlc3RzLmNsYXNzKTsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlmb3IoU3RyaW5nIHRlc3ROYW1lIDogVEVTVFNfVE9fUlVOKQotCQkJc3VpdGUuYWRkVGVzdChuZXcgTmF2aWdhdGlvblRlc3RzKHRlc3ROYW1lKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJuYXZpZ2F0aW9uX3Rlc3RfcHJvamVjdCI7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0b3JJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5wZHQucmR0LnVpLmVkaXRvci5DRWRpdG9yIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB3YWl0VW50aWxGaWxlSXNJbmRleGVkKElJbmRleCBpbmRleCwgSUZpbGUgZmlsZSwgaW50IG1heG1pbGxpcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRocmVhZC5zbGVlcCgxMDAwMCk7Ci0gICAgICAgIENDb3JlUGx1Z2luLmdldEluZGV4TWFuYWdlcigpLmpvaW5JbmRleGVyKE1BWF9XQUlUX1RJTUUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCXB1YmxpYyBOYXZpZ2F0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSwgUmVtb3RlRmFzdEluZGV4ZXIuSUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUFTVE5vZGUgdGVzdEYzKElGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBQYXJzZXJFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXRocm93IG5ldyBQYXJzZXJFeGNlcHRpb24oIm9mZnNldCBjYW4gbm90IGJlIGxlc3MgdGhhbiAwIGFuZCB3YXMgIiArIG9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgcGFydCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksIGdldEVkaXRvcklEKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIENFZGl0b3IpIHsKLSAgICAgICAgCUNFZGl0b3IgZWRpdG9yPSAoQ0VkaXRvcikgcGFydDsKLSAgICAJCUVkaXRvclRlc3RIZWxwZXIuam9pblJlY29uY2lsZXIoRWRpdG9yVGVzdEhlbHBlci5nZXRTb3VyY2VWaWV3ZXIoZWRpdG9yKSwgMTAwLCA1MDAsIDEwKTsKLSAgICAgICAgICAgICgoQWJzdHJhY3RUZXh0RWRpdG9yKXBhcnQpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBUZXh0U2VsZWN0aW9uKG9mZnNldCxsZW5ndGgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgT3BlbkRlY2xhcmF0aW9uc0FjdGlvbiBhY3Rpb24gPSAoT3BlbkRlY2xhcmF0aW9uc0FjdGlvbikgZWRpdG9yLmdldEFjdGlvbigiT3BlbkRlY2xhcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBhY3Rpb24ucnVuU3luYygpOwotCQkJCi0gICAgICAgIAkvLyB1cGRhdGUgdGhlIGZpbGUvcGFydCB0byBwb2ludCB0byB0aGUgbmV3bHkgb3BlbmVkIElGaWxlL0lFZGl0b3JQYXJ0Ci0gICAgICAgICAgICBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7IAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSAocGFydCBpbnN0YW5jZW9mIENFZGl0b3IpOwotICAgICAgICAgICAgZWRpdG9yPSAoQ0VkaXRvcikgcGFydDsKLSAgICAJCUVkaXRvclRlc3RIZWxwZXIuam9pblJlY29uY2lsZXIoRWRpdG9yVGVzdEhlbHBlci5nZXRTb3VyY2VWaWV3ZXIoZWRpdG9yKSwgMTAwLCA1MDAsIDEwKTsKLQotICAgIAkJLy8gdGhlIGFjdGlvbiBhYm92ZSBzaG91bGQgaGlnaGxpZ2h0IHRoZSBkZWNsYXJhdGlvbiwgc28gbm93IHJldHJpZXZlIGl0IGFuZCB1c2UgdGhhdCBzZWxlY3Rpb24gdG8gZ2V0IHRoZSBJQVNUTmFtZSBzZWxlY3RlZCBvbiB0aGUgVFUKLSAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSUFTVE5hbWVbXSByZXN1bHQ9IHtudWxsfTsKLSAgICAgICAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgCWZpbmFsIElUZXh0U2VsZWN0aW9uIHRleHRTZWwgPSAoSVRleHRTZWxlY3Rpb24pc2VsOwotICAgICAgICAgICAgCUlUcmFuc2xhdGlvblVuaXQgdHUgPSAoSVRyYW5zbGF0aW9uVW5pdCllZGl0b3IuZ2V0SW5wdXRDRWxlbWVudCgpOwotICAgICAgICAJCUlTdGF0dXMgb2s9IEFTVFByb3ZpZGVyLmdldEFTVFByb3ZpZGVyKCkucnVuT25BU1QodHUsIEFTVFByb3ZpZGVyLldBSVRfSUZfT1BFTiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbmV3IEFTVFJ1bm5hYmxlKCkgewotICAgICAgICAJCQlwdWJsaWMgSVN0YXR1cyBydW5PbkFTVChJTGFuZ3VhZ2UgbGFuZ3VhZ2UsIElBU1RUcmFuc2xhdGlvblVuaXQgYXN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIAkJCQlyZXN1bHRbMF09IGFzdC5nZXROb2RlU2VsZWN0b3IobnVsbCkuZmluZE5hbWUodGV4dFNlbC5nZXRPZmZzZXQoKSwgdGV4dFNlbC5nZXRMZW5ndGgoKSk7Ci0gICAgICAgIAkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0pOwotICAgICAgICAJCWFzc2VydFRydWUob2suaXNPSygpKTsKLQkJCQlyZXR1cm4gcmVzdWx0WzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3N1cGVyLnNldFVwKCk7Ci0JCQotCQlJV29ya2JlbmNoUGFnZSBwYWdlPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdSZWZlcmVuY2VbXSByZWZzPSBwYWdlLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSVZpZXdSZWZlcmVuY2Ugdmlld1JlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQlwYWdlLnNldFBhcnRTdGF0ZSh2aWV3UmVmZXJlbmNlLCBJV29ya2JlbmNoUGFnZS5TVEFURV9SRVNUT1JFRCk7Ci0JCX0KLQkJCi0JCVVSSSBwcm9qZWN0Um9vdFVSSSA9IENvbm5lY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0V29ya3NwYWNlVVJJKFBST0pFQ1RfTkFNRSk7Ci0JCVJlbW90ZVRlc3RQcm9qZWN0IHJlbW90ZVByb2plY3QgPSBuZXcgUmVtb3RlVGVzdFByb2plY3QoUFJPSkVDVF9OQU1FLCBwcm9qZWN0Um9vdFVSSSk7Ci0JCQotCQlDb25uZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlc2V0U2VydmljZU1vZGVsKHJlbW90ZVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnByaW50U2VydmljZU1vZGVsKCk7Ci0JCQotCQlmQ1Byb2plY3QgPSByZW1vdGVQcm9qZWN0LmdldENQcm9qZWN0KCk7Ci0JCi0JCUNDb3JlUGx1Z2luLmdldEluZGV4TWFuYWdlcigpLnNldEluZGV4ZXJJZChmQ1Byb2plY3QsIFJlbW90ZUZhc3RJbmRleGVyLklEKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsgCi0JfQotCi19CmRpZmYgLS1naXQgYS9yZWxlbmcvLmN2c2lnbm9yZSBiL3JlbGVuZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRlZGY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLnByb2plY3QKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhNmJiYy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjZlOTguLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCi1nZW5lcmF0ZUZlYXR1cmVWZXJzaW9uU3VmZml4PXRydWUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWRiOTQuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwNSwyMDA4IElCTSBDb3Jwb3JhdGlvbgotIwotIyBmZWF0dXJlcy5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1QVFAgUGFyYWxsZWwgTGFuZ3VhZ2UgRGV2ZWxvcG1lbnQgVG9vbHMgVVBDIFN1cHBvcnQKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2UgUFRQIFVwZGF0ZSBTaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1BZGRzIGEgcmFuZ2Ugb2Ygc3RhdGljIGFuYWx5c2lzIGFuZCBwcm9ncmFtbWluZyBhc3Npc3RhbmNlIHRvb2xzLgotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwyMDA4IElCTVxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLQotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk3NjY4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24iPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2U+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlbyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LmNvcmUiIHZlcnNpb249IjQuMC4yIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jZHQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LmRvYy51c2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLnVwYyIgdmVyc2lvbj0iNS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5jdnNpZ25vcmUgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk0MjllLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXJlc3VsdHMKLXRvb2xzCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAxZGU3Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJlbGVuZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkLnNoIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTc4OGIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBleHBvcnQgZGlzcGxheSBmb3IgcnVubmluZyB0aGUgdGVzdHMKLWV4cG9ydCBESVNQTEFZPToxCi0KLSMgc2V0IHVwIHRvIHVzZSB0aGUgSmF2YSA1IEpSRQotZXhwb3J0IFBBVEg9L29wdC9wdWJsaWMvY29tbW9uL2libS1qYXZhMi1wcGMtNTAvYmluOiRQQVRICi0KLSMgbWFrZSBzdXJlIHdlJ3JlIGluIHRoZSByZWxlbmcgcHJvamVjdCBkaXIgCi1jZCBgZGlybmFtZSAkMGAKLQotdW1hc2sgMDAyMgotCi0jIENoZWNrb3V0IGJhc2VidWlsZGVyIHRvIHJ1biB0aGUgYnVpbGQKLW1rZGlyIC1wIHRvb2xzCi1jZCB0b29scwotY3ZzIC1kOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlIFwKLQljaGVja291dCAtciBSMzVfUkMyIG9yZy5lY2xpcHNlLnJlbGVuZy5iYXNlYnVpbGRlcgotY2QgLi4KLQotIyBMZXQncyBnbyEKLWphdmEgLWphciB0b29scy9vcmcuZWNsaXBzZS5yZWxlbmcuYmFzZWJ1aWxkZXIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmphciBcCi0JLXdzIGd0ayAtYXJjaCBwcGMgLW9zIGxpbnV4IC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXIgJCoKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9idWlsZC54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NWYxZDMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlBUUCIgZGVmYXVsdD0ibmlnaHRseSI+Ci0JPHRhcmdldCBuYW1lPSJoaSI+Ci0JCTxlY2hvIG1lc3NhZ2U9IiR7ZWNsaXBzZS5ob21lfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InppcHMsdGVzdCIvPgotCTx0YXJnZXQgbmFtZT0ibmlnaHRseSIgZGVwZW5kcz0idGFnLHppcHMsc2lnbix0ZXN0LGNvcHkiLz4KLQk8dGFyZ2V0IG5hbWU9InRlc3RidWlsZCIgZGVwZW5kcz0iemlwcyx0ZXN0LGNvcHkiLz4KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkY29weSIgZGVwZW5kcz0iemlwcyxjb3B5Ii8+Ci0JCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRvdWNoIGZpbGU9IiR7dXNlci5ob21lfS8uY3ZzcGFzcyIgLz4KLQkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlRGlzdCIgdmFsdWU9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9kb3dubG9hZHMvZHJvcHMvUi0zLjUtMjAwOTA2MTExNTQwL2VjbGlwc2UtU0RLLTMuNS1saW51eC1ndGstcHBjLnRhci5neiIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2R0RGlzdCIgdmFsdWU9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvY2R0L2J1aWxkcy82LjEuMC9JLkkyMDA5MDcyNDA4MDUvY2R0LW1hc3Rlci02LjEuMC1JMjAwOTA3MjQwODA1LnppcCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibXlseW5EaXN0IiB2YWx1ZT0iL2hvbWUvZGF0YS9odHRwZC9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9teWx5bi91cGRhdGUvZ2FsaWxlby9teWx5bi0zLjIuMC52MjAwOTA2MTctMDEwMC1lMy40LnppcCIvPgotCQk8cHJvcGVydHkgbmFtZT0icnNlRGlzdCIgdmFsdWU9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvZHNkcC90bS9kb3dubG9hZHMvZHJvcHMvUi0zLjEtMjAwOTA2MTcxNDAwL1JTRS1TREstMy4xLnppcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGF1SmFycyIgdmFsdWU9IiR7dXNlci5ob21lfS90YXVfamFycy56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VSZWxlYXNlIiB2YWx1ZT0iZ2FsaWxlbyIvPgotCQk8cHJvcGVydHkgbmFtZT0icHRwQnJhbmNoVmVyc2lvbiIgdmFsdWU9IjMuMC4wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaG90cmFuQnJhbmNoVmVyc2lvbiIgdmFsdWU9IjUuMC4wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0aW1lc3RhbXAiIHZhbHVlPSIke0RTVEFNUH0ke1RTVEFNUH0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb3JjZUNvbnRleHRRdWFsaWZpZXIiIHZhbHVlPSIke3RpbWVzdGFtcH0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkaW5nT1NHaSIgdmFsdWU9InRydWUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkRGlyZWN0b3J5IiB2YWx1ZT0iJHtiYXNlZGlyfS9yZXN1bHRzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3B5VG9EaXIiIHZhbHVlPSIvaG9tZS93d3cvdG9vbHMvcHRwL2J1aWxkcy8ke2VjbGlwc2VSZWxlYXNlfSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVzdERpcmVjdG9yeSIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L3Rlc3QiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhc2VMb2NhdGlvbiIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L2VjbGlwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBkZS5idWlsZC5zY3JpcHRzIiB2YWx1ZT0iJHtlY2xpcHNlLnBkZWJ1aWxkLnNjcmlwdHN9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb2xsZWN0aW5nRm9sZGVyIiB2YWx1ZT0iZWNsaXBzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYXJjaGl2ZVByZWZpeCIgdmFsdWU9ImVjbGlwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkVHlwZSIgdmFsdWU9IkkiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZElkIiB2YWx1ZT0iJHtidWlsZFR5cGV9JHt0aW1lc3RhbXB9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ6aXBzZGlyIiB2YWx1ZT0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZFR5cGV9LiR7YnVpbGRJZH0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InB0cE1hc3RlckZpbGUiIHZhbHVlPSJwdHAtbWFzdGVyLSR7cHRwQnJhbmNoVmVyc2lvbn0tJHtidWlsZElkfS56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBob3RyYW5NYXN0ZXJGaWxlIiB2YWx1ZT0icGhvdHJhbi1tYXN0ZXItJHtwaG90cmFuQnJhbmNoVmVyc2lvbn0tJHtidWlsZElkfS56aXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VUZXN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UudGVzdF8zLjIuMCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFpbHRvIiB2YWx1ZT0iZy53YXRzb25AY29tcHV0ZXIub3JnIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlUm9vdCIgdmFsdWU9Ijpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFzZW9zIiB2YWx1ZT0iJHtvc2dpLm9zfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFzZXdzIiB2YWx1ZT0iJHtvc2dpLndzfSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFzZWFyY2giIHZhbHVlPSIke29zZ2kuYXJjaH0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhZ2JyYW5jaCIgdmFsdWU9IiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGFnbmFtZSIgdmFsdWU9InYke3RpbWVzdGFtcH0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRlc3RSZXBvcnRzIiB2YWx1ZT0iJHt6aXBzZGlyfS90ZXN0UmVwb3J0cyIvPgotCQk8cHJvcGVydHkgbmFtZT0ianVuaXQtcmVwb3J0LW91dHB1dCIgdmFsdWU9IiR7dGVzdFJlcG9ydHN9Ii8+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9Im9uV2luZG93cyI+Ci0JCQk8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+Ci0JCTwvY29uZGl0aW9uPgotCQk8bWtkaXIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSIvPgotCQk8bWtkaXIgZGlyPSIke3Rlc3RSZXBvcnRzfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZmV0Y2giIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgZGlyPSIke3BkZS5idWlsZC5zY3JpcHRzfSIgdGFyZ2V0PSJwcmVCdWlsZCI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vbWFzdGVyIi8+Ci0JCTwvYW50PgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgZGlyPSIke3BkZS5idWlsZC5zY3JpcHRzfSIgdGFyZ2V0PSJmZXRjaCI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYnVpbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vbWFzdGVyIi8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0idW56aXAiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iZG9udFVuemlwIj4KLQkJPHVudGFyIHNyYz0iJHtlY2xpcHNlRGlzdH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9IiBjb21wcmVzc2lvbj0iZ3ppcCIvPgotCQk8dW56aXAgc3JjPSIke3JzZURpc3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fSIvPgotCQk8dW56aXAgc3JjPSIke2NkdERpc3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9lY2xpcHNlIi8+Ci0JCTx1bnppcCBzcmM9IiR7bXlseW5EaXN0fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iemlwcyIgZGVwZW5kcz0iaW5pdCx1bnppcCI+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBkaXI9IiR7cGRlLmJ1aWxkLnNjcmlwdHN9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS9tYXN0ZXIiIC8+Ci0JCTwvYW50PgotCQk8Y29uY2F0IGRlc3RmaWxlPSIke3ppcHNkaXJ9L2NvbXBpbGVsb2cudHh0Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucyIgaW5jbHVkZXM9IioqLyouYmluLmxvZyIvPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIiBpbmNsdWRlcz0iKiovKkBkb3QubG9nIi8+Ci0JCTwvY29uY2F0PgotCQk8bG9hZGZpbGUgcHJvcGVydHk9ImNvbXBpbGVMb2ciIHNyY0ZpbGU9IiR7emlwc2Rpcn0vY29tcGlsZWxvZy50eHQiLz4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaGFzRXJyb3JzIj4KLQkJCTxjb250YWlucyBzdHJpbmc9IiR7Y29tcGlsZUxvZ30iIHN1YnN0cmluZz0iIEVSUk9SIi8+Ci0JCTwvY29uZGl0aW9uPgotCQk8bW92ZSBmaWxlPSIke3ppcHNkaXJ9LyR7cHRwTWFzdGVyRmlsZX0iIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fSIvPgotCQk8bW92ZSBmaWxlPSIke3ppcHNkaXJ9LyR7cGhvdHJhbk1hc3RlckZpbGV9IiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLQkJCi0JCTx1bnppcCBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9LyR7cHRwTWFzdGVyRmlsZX0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUiLz4KLQkJPHVuemlwIHNyYz0iJHtidWlsZERpcmVjdG9yeX0vJHtwaG90cmFuTWFzdGVyRmlsZX0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUiLz4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9lcGwtdjEwLmh0bWwiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2UiLz4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9ub3RpY2UuaHRtbCIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUvZWNsaXBzZSIvPgotCQk8Y29weSBmaWxlPSJidWlsZHNpdGUueG1sIiB0b2ZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpdGUvZWNsaXBzZS9zaXRlLnhtbCIvPgotCQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9zaXRlL2VjbGlwc2Uvc2l0ZS54bWwiPgotCQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkB0aW1lU3RhbXBAIiB2YWx1ZT0iJHt0aW1lc3RhbXB9Ii8+Ci0JCTwvcmVwbGFjZT4KLQkJPGNvcHkgZmlsZT0icGFjay5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0vc2l0ZS9lY2xpcHNlIi8+Ci0KLQkJPHppcCBkZXN0ZmlsZT0iJHt6aXBzZGlyfS8ke3B0cE1hc3RlckZpbGV9IgotCQkJYmFzZWRpcj0iJHtidWlsZERpcmVjdG9yeX0vc2l0ZS9lY2xpcHNlIi8+Ci0JCQotCQk8dW56aXAgc3JjPSIke2J1aWxkRGlyZWN0b3J5fS8ke3Bob3RyYW5NYXN0ZXJGaWxlfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vcGhvdHJhbl9zaXRlIi8+Ci0JCTxjb3B5IGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L2VjbGlwc2UvZXBsLXYxMC5odG1sIiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0vcGhvdHJhbl9zaXRlL2VjbGlwc2UiLz4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vZWNsaXBzZS9ub3RpY2UuaHRtbCIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3Bob3RyYW5fc2l0ZS9lY2xpcHNlIi8+Ci0JCTxjb3B5IGZpbGU9InBob3RyYW5fYnVpbGRzaXRlLnhtbCIgdG9maWxlPSIke2J1aWxkRGlyZWN0b3J5fS9waG90cmFuX3NpdGUvZWNsaXBzZS9zaXRlLnhtbCIvPgotCQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9waG90cmFuX3NpdGUvZWNsaXBzZS9zaXRlLnhtbCI+Ci0JCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQHRpbWVTdGFtcEAiIHZhbHVlPSIke3RpbWVzdGFtcH0iLz4KLQkJPC9yZXBsYWNlPgotCQk8Y29weSBmaWxlPSJwYWNrLnByb3BlcnRpZXMiIHRvZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9waG90cmFuX3NpdGUvZWNsaXBzZSIvPgotCi0JCTx6aXAgZGVzdGZpbGU9IiR7emlwc2Rpcn0vJHtwaG90cmFuTWFzdGVyRmlsZX0iCi0JCQliYXNlZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9waG90cmFuX3NpdGUvZWNsaXBzZSIvPgotCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InNpZ24iIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iaGFzRXJyb3JzIj4KLQkJPGV4ZWMgZXhlY3V0YWJsZT0ic2lnbiI+Ci0JCQk8YXJnIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfS8ke3B0cE1hc3RlckZpbGV9Ii8+Ci0JCQk8YXJnIHZhbHVlPSJub21haWwiLz4KLQkJCTxhcmcgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpZ25lZCIvPgotCQk8L2V4ZWM+Ci0JCTx3YWl0Zm9yIG1heHdhaXQ9IjMwIiBtYXh3YWl0dW5pdD0ibWludXRlIj4KLQkJCTxhdmFpbGFibGUgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vc2lnbmVkLyR7cHRwTWFzdGVyRmlsZX0iLz4KLQkJPC93YWl0Zm9yPgotCQk8bW92ZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9zaWduZWQvJHtwdHBNYXN0ZXJGaWxlfSIgdG9kaXI9IiR7emlwc2Rpcn0iLz4KLQkJPGV4ZWMgZXhlY3V0YWJsZT0ic2lnbiI+Ci0JCQk8YXJnIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfS8ke3Bob3RyYW5NYXN0ZXJGaWxlfSIvPgotCQkJPGFyZyB2YWx1ZT0ibm9tYWlsIi8+Ci0JCQk8YXJnIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS9zaWduZWQiLz4KLQkJPC9leGVjPgotCQk8d2FpdGZvciBtYXh3YWl0PSIzMCIgbWF4d2FpdHVuaXQ9Im1pbnV0ZSI+Ci0JCQk8YXZhaWxhYmxlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpZ25lZC8ke3Bob3RyYW5NYXN0ZXJGaWxlfSIvPgotCQk8L3dhaXRmb3I+Ci0JCTxtb3ZlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3NpZ25lZC8ke3Bob3RyYW5NYXN0ZXJGaWxlfSIgdG9kaXI9IiR7emlwc2Rpcn0iLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iaGFzRXJyb3JzIi8+Ci0JPHRhcmdldCBuYW1lPSJjb3B5IiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9Imhhc0Vycm9ycyI+Ci0JCTxta2RpciBkaXI9IiR7Y29weVRvRGlyfS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfSIvPgotCQk8Y29weSB0b2Rpcj0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZFR5cGV9LiR7YnVpbGRJZH0iLz4KLQkJPC9jb3B5PgotCQk8IS0tIENyZWF0ZSBzeW1saW5rIHRvIGxhdGVzdCBidWlsZCAtLT4KLQkJPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7Y29weVRvRGlyfS9sYXRlc3QiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgotCQk8c3ltbGluayBsaW5rPSIke2NvcHlUb0Rpcn0vbGF0ZXN0IiByZXNvdXJjZT0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9IiBvdmVyd3JpdGU9InRydWUiLz4KLQkJPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7Y29weVRvRGlyfS9wdHAtbWFzdGVyLSR7cHRwQnJhbmNoVmVyc2lvbn0tbGF0ZXN0LnppcCIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0JCTxzeW1saW5rIGxpbms9IiR7Y29weVRvRGlyfS9wdHAtbWFzdGVyLSR7cHRwQnJhbmNoVmVyc2lvbn0tbGF0ZXN0LnppcCIgcmVzb3VyY2U9IiR7Y29weVRvRGlyfS8ke2J1aWxkVHlwZX0uJHtidWlsZElkfS8ke3B0cE1hc3RlckZpbGV9IiBvdmVyd3JpdGU9InRydWUiLz4KLQkJPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7Y29weVRvRGlyfS9yZHQtc2VydmVyLXVuaXgtMS4wLWxhdGVzdC50YXIiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgotCQk8c3ltbGluayBsaW5rPSIke2NvcHlUb0Rpcn0vcmR0LXNlcnZlci11bml4LTEuMC1sYXRlc3QudGFyIiByZXNvdXJjZT0iJHtjb3B5VG9EaXJ9LyR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9L3JkdC1zZXJ2ZXItdW5peC0xLjAudGFyIiBvdmVyd3JpdGU9InRydWUiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InRhZ29uZSI+Ci0JCTxjdnMgY3Zzcm9vdD0iL2N2c3Jvb3QvdG9vbHMiIGNvbW1hbmQ9InJ0YWcgJHt0YWdicmFuY2h9ICR7dGFnbmFtZX0gJHt0YWdtb2R1bGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ0YWciIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFzdGVyIi8+Ci0JCTwvYW50Y2FsbD4KLQkJCi0JCTwhLS1GZWF0dXJlcy0tPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZG0tZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBlcmYtZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuZm9ydHJhbi1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmR0LWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQkKLQkJPCEtLVBsdWdpbnMtLT4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscy5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uY29yZSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLmhlbHAiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkiLz4KLQkJPC9hbnRjYWxsPgkJCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIucHJveHkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0udWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0iLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnNkbS5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZGVidWcvb3JnLmVjbGlwc2UucHRwLmRlYnVnLnVpIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0iLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscyIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdCIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQubGF1bmNoZXIiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC51aSIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXMiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvZG9jL29yZy5lY2xpcHNlLnB0cC5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbiIvPgotCQk8L2FudGNhbGw+CQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzIi8+Ci0JCTwvYW50Y2FsbD4JCQkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmphcnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBlcmZkbWYiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnNlbGluc3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnNlbGluc3Rmb3J0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUuc3R1YnMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuZG9jLnVzZXIiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5haXgucHBjIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4NiIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi5wYXJhbGxlbCIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGFwaXRlc3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUudGVzdHMiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzLnRlc3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnRlc3QiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4tZmVhdHVyZSIvPgotCQk8L2FudGNhbGw+CQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5jZHRpbnRlcmZhY2UiLz4KLQkJPC9hbnRjYWxsPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5jZHRpbnRlcmZhY2UudnBnIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY29yZSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNvcmUuaW50ZWwiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5jb3JlLnZwZyIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmVycm9ycGFyc2Vycy54bGYiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5pbnRlbC1mZWF0dXJlIi8+Ci0JCTwvYW50Y2FsbD4JCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmNvcmUiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci5nbnUudWkiLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci5pbnRlbC51aSIvPgotCQk8L2FudGNhbGw+Ci0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLnVpIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci54bGYudWkiLz4KLQkJPC9hbnRjYWxsPgkJCi0JCTxhbnRjYWxsIHRhcmdldD0idGFnb25lIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YWdtb2R1bGUiIHZhbHVlPSJvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLnVpIi8+Ci0JCTwvYW50Y2FsbD4JCQotCQk8YW50Y2FsbCB0YXJnZXQ9InRhZ29uZSI+Ci0JCQk8cGFyYW0gbmFtZT0idGFnbW9kdWxlIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi51aS52cGciLz4KLQkJPC9hbnRjYWxsPgkKLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdvbmUiPgotCQkJPHBhcmFtIG5hbWU9InRhZ21vZHVsZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4ueGxmLWZlYXR1cmUiLz4KLQkJPC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGRzaXRlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL2J1aWxkc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMGRiMzIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGRzaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8iPgotCQlQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSB1cGRhdGUgc2l0ZSAtIFJlbGVhc2UgMy4wCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIgbGFiZWw9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cF8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAuY29yZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLmNvcmVfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuc2VydmljZXNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAudXRpbHNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbCIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbF8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlXzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHMiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHNfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUucnNlXzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0iIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG1fMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLmV4dGVybmFsIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWxfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZV8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyXzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQYXJhbGxlbCBUb29scyBQbGF0Zm9ybSAzLjAiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucm0ub3Blbm1waV8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdCIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBsZHRfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaV8zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwY18zLjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iMy4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iUGFyYWxsZWwgVG9vbHMgUGxhdGZvcm0gMy4wIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucGVyZiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucHRwLnBlcmZfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucHRwLnBlcmYudGF1IiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXVfMy4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjMuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IlBhcmFsbGVsIFRvb2xzIFBsYXRmb3JtIDMuMCIvPgotCTwvZmVhdHVyZT4KLQkKLQk8Y2F0ZWdvcnktZGVmIG5hbWU9IlJlbW90ZSBEZXZlbG9wbWVudCBUb29scyIgbGFiZWw9IlJlbW90ZSBEZXZlbG9wbWVudCBUb29scyIvPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wdHAucmR0IiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wdHAucmR0XzMuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSIzLjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgRGV2ZWxvcG1lbnQgVG9vbHMiLz4KLQk8L2ZlYXR1cmU+Ci0JCi0JPGNhdGVnb3J5LWRlZiBuYW1lPSJGb3J0cmFuIERldmVsb3BtZW50IFRvb2xzIChQaG90cmFuKSIgbGFiZWw9IkZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMgKFBob3RyYW4pIi8+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4iIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbl81LjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scyAoUGhvdHJhbikiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWwiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbi5pbnRlbF81LjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiIG9zPSJsaW51eCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJGb3J0cmFuIERldmVsb3BtZW50IFRvb2xzIChQaG90cmFuKSIvPgotCTwvZmVhdHVyZT4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGhvdHJhbi54bGYiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP2ZpbGU9L3Rvb2xzL3B0cC9waG90cmFuL3JlbGVhc2VzL2dhbGlsZW8vZmVhdHVyZXMvb3JnLmVjbGlwc2UucGhvdHJhbi54bGZfNS4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjUuMC4wLkB0aW1lU3RhbXBAIj4KLQkJPGNhdGVnb3J5IG5hbWU9IkZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMgKFBob3RyYW4pIi8+Ci0JPC9mZWF0dXJlPjwvc2l0ZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcGhvdHJhbi5tYXAgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXBzL3Bob3RyYW4ubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBlMzIyLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcGhvdHJhbi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0hIE1hc3RlciBmZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnBob3RyYW4ubWFzdGVyPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hc3RlcgotCi0hIFBob3RyYW4gZmVhdHVyZXMKLWZlYXR1cmVAb3JnLmVjbGlwc2UucGhvdHJhbj1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnBob3RyYW4ueGxmPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLnhsZi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWw9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWwtZmVhdHVyZQotCi0hIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLmNvcmU9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4ubWFuYWdlZGJ1aWxkZXIuY29yZT1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci51aT1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4uY2R0aW50ZXJmYWNlPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNkdGludGVyZmFjZQotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4udWk9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4udWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmdudS51aT1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi5tYW5hZ2VkYnVpbGRlci5nbnUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLmNkdGludGVyZmFjZS52cGc9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY2R0aW50ZXJmYWNlLnZwZwotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4uY29yZS52cGc9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uY29yZS52cGcKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLnVpLnZwZz1AcGhvdHJhblRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Bob3RyYW4vb3JnLmVjbGlwc2UucGhvdHJhbi51aS52cGcKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmludGVsLnVpPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLmludGVsLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucGhvdHJhbi5jb3JlLmludGVsPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLmNvcmUuaW50ZWwKLXBsdWdpbkBvcmcuZWNsaXBzZS5waG90cmFuLmVycm9ycGFyc2Vycy54bGY9QHBob3RyYW5UYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9waG90cmFuL29yZy5lY2xpcHNlLnBob3RyYW4uZXJyb3JwYXJzZXJzLnhsZgotcGx1Z2luQG9yZy5lY2xpcHNlLnBob3RyYW4ubWFuYWdlZGJ1aWxkZXIueGxmLnVpPUBwaG90cmFuVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcGhvdHJhbi9vcmcuZWNsaXBzZS5waG90cmFuLm1hbmFnZWRidWlsZGVyLnhsZi51aQotICAgICAgICAgCi0hIFRlc3RzCi0KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcHRwLm1hcCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hcHMvcHRwLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxOWJmOC4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXBzL3B0cC5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotISBUaGUgbWFzdGVyCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5tYXN0ZXI9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubWFzdGVyCi0KLSEgUFRQIGZlYXR1cmVzCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC51dGlscy1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucmVtb3RlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUucmVtb3RldG9vbHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2U9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm1waWNoMi1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5ybS5vcGVubXBpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWw9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAuZXh0ZXJuYWwtZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy1mZWF0dXJlCi0KLSEgUExEVCBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGxkdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wbGR0LmxhcGktZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMtZmVhdHVyZQotCi0hIFBURiBmZWF0dXJlcwotZmVhdHVyZUBvcmcuZWNsaXBzZS5wdHAucGVyZj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5wZXJmLWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LWZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LmZvcnRyYW49QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuZm9ydHJhbi1mZWF0dXJlCi0KLSEgUkRUIGZlYXR1cmVzCi1mZWF0dXJlQG9yZy5lY2xpcHNlLnB0cC5yZHQ9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmR0LWZlYXR1cmUKLQotISBQVFAgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAudXRpbHMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJlbW90ZXRvb2xzLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yc2UudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5oZWxwCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC5wcm94eT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ubGwucHJveHkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmxsLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUuaGVscAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUucHJveHk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLnByb3h5Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLmlibS5wZS51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0ucGUudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm9wZW5tcGkuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkub3Blbm1waS5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5vcGVubXBpLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvY29yZS9vcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJtLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kZWJ1Zy9vcmcuZWNsaXBzZS5wdHAuZGVidWcuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG09QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0KLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcuc2RtLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0uY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0udWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuZGVidWcudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG09QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2RlYnVnL29yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0KLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucHJveHk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnByb3h5Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnV0aWxzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5sYXVuY2g9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLmxhdW5jaAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5oZWxwPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9kb2Mvb3JnLmVjbGlwc2UucHRwLmhlbHAKLQotISBTZXJ2aWNlcyBQbHVnaW5zCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMudWk9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL2NvcmUvb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpCi0KLSEgUmVtb3RlIFRvb2xzIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuY29yZT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQuZ2VuZXJpY2hvc3Q9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5nZW5lcmljaG9zdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5lbnZpcm9ubWVudC5sYXVuY2hlcj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LmxhdW5jaGVyCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLmVudmlyb25tZW50LnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMuZW52aXJvbm1lbnQudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMucHJlZmVyZW5jZXM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy5wcmVmZXJlbmNlcwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZW1vdGV0b29scy51dGlscz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnJlbW90ZXRvb2xzLnV0aWxzCi0KLSEgUExEVCBQbHVnaW5zCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24KLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5oZWxwCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubGFwaQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5hbmFseXNpcz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvb3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmFuYWx5c2lzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0Lm9wZW5tcC5jb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBsZHQub3Blbm1wLnVpLnB2PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9vcmcuZWNsaXBzZS5wdHAucGxkdC5vcGVubXAudWkucHYKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL29yZy5lY2xpcHNlLnB0cC5wbGR0LndpemFyZHMKLQotISBFVEYgUGx1Z2lucwotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5qYXJzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5qYXJzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3Q9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3Rvb2xzL3BlcmYvb3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGlzZWxlY3QKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGVyZmRtZj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi50YXUucGVyZmRtZgotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnNlbGluc3Rmb3J0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5zZWxpbnN0Zm9ydAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRvb2xvcHRzCi0KLSEgUkRUIFBsdWdpbnMKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LmNvcmU9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0LnVpPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZHQuc2VydmljZXM9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JkdC9vcmcuZWNsaXBzZS5wdHAucmR0LnNlcnZpY2VzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnJkdC5kb2MudXNlcj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuZG9jLnVzZXIKLXBsdWdpbkBvcmcuZWNsaXBzZS5wdHAucmR0Lm1hbmFnZWRidWlsZGVyLnhsYy51aT1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQubWFuYWdlZGJ1aWxkZXIueGxjLnVpCi0KLSEgRnJhZ21lbnRzCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAuYWl4LnBwYz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5haXgucHBjCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubGludXgucHBjPUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYwotZnJhZ21lbnRAb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5saW51eC54ODYKLWZyYWdtZW50QG9yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQ9QHB0cFRhZ0AsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scywsb3JnLmVjbGlwc2UucHRwL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAubGludXgueDg2XzY0Ci1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubWFjb3N4LnBwYz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4Nj1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2Ci1mcmFnbWVudEBvcmcuZWNsaXBzZS5wdHAucGVyZi5wYXJhbGxlbD1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvdG9vbHMvcGVyZi9vcmcuZWNsaXBzZS5wdHAucGVyZi5wYXJhbGxlbAotCi0hIFRlc3RzCi1wbHVnaW5Ab3JnLmVjbGlwc2UucHRwLnBlcmYudGF1LnBhcGl0ZXN0PUBwdHBUYWdALDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsLG9yZy5lY2xpcHNlLnB0cC90b29scy9wZXJmL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5wYXBpdGVzdAotcGx1Z2luQG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cz1AcHRwVGFnQCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLCxvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS50ZXN0cwotCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9tYXN0ZXIvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNkMmU2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQYXJhbWV0ZXJzIGRlc2NyaWJpbmcgaG93IGFuZCB3aGVyZSB0byBleGVjdXRlIHRoZSBidWlsZC4KLSMgVHlwaWNhbCB1c2VycyBuZWVkIG9ubHkgdXBkYXRlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKLSMgICAgYmFzZUxvY2F0aW9uIC0gd2hlcmUgdGhpbmdzIHlvdSBhcmUgYnVpbGRpbmcgYWdhaW5zdCBhcmUgaW5zdGFsbGVkCi0jICAgIGJvb3RjbGFzc3BhdGggLSBUaGUgYmFzZSBqYXJzIHRvIGNvbXBpbGUgYWdhaW5zdCAodHlwaWNhbHkgcnQuamFyKQotIyAgICBjb25maWdzIC0gdGhlIGxpc3Qgb2Yge29zLCB3cywgYXJjaH0gY29uZmlndXJhdGlvbnMgdG8gYnVpbGQuICAKLSMKLSMgT2YgY291cnNlIGFueSBvZiB0aGUgc2V0dGluZ3MgaGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjJ2luZyAKLSMgdGhlbSBvbiB0aGUgY29tbWFuZCBsaW5lIChlLmcuLCAtRGJhc2VMb2NhdGlvbj1kOi9lY2xpcHNlCi0KLSMjIyMjIyMjIyMjIyMgQ1ZTIENPTlRST0wgIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgQ1ZTIHRhZyB0byB1c2Ugd2hlbiBmZXRjaGluZyB0aGUgbWFwIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkKLW1hcFZlcnNpb25UYWc9SEVBRAotCi0jIFRoZSBDVlMgdGFnIHRvIHVzZSB3aGVuIGZldGNoaW5nIGVsZW1lbnRzIHRvIGJ1aWxkLiAgQnkgZGVmYXVsdCB0aGUKLSMgYnVpbGRlciB3aWxsIHVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgbWFwcy4gIFVzZSB0aGlzIHZhbHVlIHRvIG92ZXJyaWRlCi0jIGZvciBleGFtcGxlLCB3aGVuIGRvaW5nIGEgbmlnaHRseSBidWlsZCBvdXQgb2YgSEVBRAotIyBmZXRjaFRhZz1IRUFECi0KLXB0cFRhZz1IRUFECi1waG90cmFuVGFnPUhFQUQKLQotIyMjIyMjIyMjIyMjIyMgQlVJTEQgLyBHRU5FUkFUSU9OIENPTlRST0wgIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGJ1aWxkIGVsZW1lbnRzIHdpbGwgYmUgZmV0Y2hlZCBhbmQgd2hlcmUKLSMgdGhlIGJ1aWxkIHdpbGwgdGFrZSBwbGFjZS4gIGJ1aWxkRGlyZWN0b3J5IGFuZCBpbnN0YWxsIHNob3VsZCBiZSB0aGUgc2FtZQotIyB2YWx1ZS4KLWJ1aWxkRGlyZWN0b3J5PWJ1aWxkCi0KLSMgVHlwZSBvZiBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuICBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBpcwotIyBvbmUgb2YgSSwgTiwgTSwgUywgLi4uCi1idWlsZFR5cGU9SQotCi0jIElEIG9mIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuCi1idWlsZElkPVRlc3RCdWlsZAotCi0jIExhYmVsIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci1idWlsZExhYmVsPSR7YnVpbGRUeXBlfS4ke2J1aWxkSWR9Ci0KLSMgVGltZXN0YW1wIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci10aW1lc3RhbXA9MDA3Ci0KLSMgQmFzZSBsb2NhdGlvbiBmb3IgYW55dGhpbmcgdGhlIGJ1aWxkIG5lZWRzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIEZvciBleGFtcGxlLAotIyB3aGVuIGJ1aWxkaW5nIEdFRiwgdGhlIGJhc2VMb2NhdGlvbiBzaG91bGQgYmUgdGhlIGxvY2F0aW9uIG9mIGEgcHJldmlvdXNseQotIyBpbnN0YWxsZWQgRWNsaXBzZSBhZ2FpbnN0IHdoaWNoIHRoZSBHRUYgY29kZSB3aWxsIGJlIGNvbXBpbGVkLgotYmFzZUxvY2F0aW9uPQotCi0jT3MvV3MvQXJjaC9ubCBvZiB0aGUgZWNsaXBzZSBzcGVjaWZpZWQgYnkgYmFzZUxvY2F0aW9uCi0jYmFzZW9zCi0jYmFzZXdzCi0jYmFzZWFyY2gKLSNiYXNlbmwKLQotIyBUaGUgbG9jYXRpb24gdW5kZXJ3aGljaCBhbGwgb2YgdGhlIGJ1aWxkIG91dHB1dCB3aWxsIGJlIGNvbGxlY3RlZC4gIFRoaXMgd2lsbCBiZQotIyB0aGUgcm9vdCBwYXRoIGluIHRoZSByZXN1bHRhbnQgemlwIGZpbGUuCi1jb2xsUGxhY2U9ZWNsaXBzZQotCi0jIFRoZSBkaXJlY3RvcnkgIGluIHdoaWNoIHRvIGV4ZWN1dGUgemlwIG9mIHRoZSAke2NvbGxQbGFjZX0gZGlyZWN0b3J5Ci1jb2xsQmFzZT0uCi0KLSMgVGhlIGxpc3Qgb2Yge29zLCB3cywgYXJjaH0gY29uZmlndXJhdGlvbnMgdG8gYnVpbGQuICBUaGlzIAotIyB2YWx1ZSBpcyBhICcmJyBzZXBhcmF0ZWQgbGlzdCBvZiAnLCcgc2VwYXJhdGUgdHJpcGxlcy4gIEZvciBleGFtcGxlLCAKLSMgICAgIGNvbmZpZ3M9d2luMzIsd2luMzIseDg2ICYgbGludXgsbW90aWYseDg2Ci0jIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzICosKiwqCi1jb25maWdzPSBcCi0JICBhaXgsbW90aWYscHBjIFwKLSAgICAmIGxpbnV4LGd0ayx4ODYgXAotICAgICYgbGludXgsZ3RrLHg4Nl82NCBcCi0gICAgJiBsaW51eCxndGsscHBjIFwKLSAgICAmIG1hY29zeCxjYXJib24scHBjIFwKLSAgICAmIHdpbjMyLHdpbjMyLHg4NgotCi1vdXRwdXRVcGRhdGVKYXJzPXRydWUKLWdyb3VwQ29uZmlndXJhdGlvbnM9dHJ1ZQotCi0jQXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIHppcCBleGVjdXRhYmxlCi16aXBhcmdzPQotCi0jIyMjIyMjIyMjIyMjIEpBVkEgQ09NUElMRVIgT1BUSU9OUyAjIyMjIyMjIyMjIyMjIwotIyBUaGUgbG9jYXRpb24gb2YgdGhlIEphdmEgamFycyB0byBjb21waWxlIGFnYWluc3QuICBUeXBpY2FsbHkgdGhlIHJ0LmphciBmb3IgeW91ciBKREsvSlJFCi0jYm9vdGNsYXNzcGF0aD1kOi9pYm0xLjMuMS9qcmUvbGliL3J0LmphcgotCi1qYXZhY0RlYnVnSW5mbz1vbgotamF2YWNWZXJib3NlPXRydWUKLWphdmFjRmFpbE9uRXJyb3I9ZmFsc2UKLQotIyBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUKLWphdmFjU291cmNlPTEuNQotCi0jIFRoZSB2ZXJzaW9uIG9mIHRoZSBieXRlIGNvZGUgdGFyZ2V0ZWQKLWphdmFjVGFyZ2V0PTEuNQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvbWFzdGVyL2N1c3RvbVRhcmdldHMueG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvbWFzdGVyL2N1c3RvbVRhcmdldHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzg2ODgwLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL21hc3Rlci9jdXN0b21UYXJnZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiID4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFJ1biBhIGdpdmVuICR7dGFyZ2V0fSBvbiBhbGwgZWxlbWVudHMgYmVpbmcgYnVpbHQgLS0+Ci08IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50cyI+Ci0JPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCQk8cHJvcGVydHkgbmFtZT0idHlwZSIgdmFsdWU9ImZlYXR1cmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0ib3JnLmVjbGlwc2UucHRwLm1hc3RlciIvPgotCTwvYW50PgotCTxhbnQgYW50ZmlsZT0iJHtnZW5lcmljVGFyZ2V0c30iIHRhcmdldD0iJHt0YXJnZXR9Ij4KLQkJPHByb3BlcnR5IG5hbWU9InR5cGUiIHZhbHVlPSJmZWF0dXJlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBob3RyYW4ubWFzdGVyIi8+Ci0JPC9hbnQ+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRhcmdldHMgdG8gYXNzZW1ibGUgdGhlIGJ1aWx0IGVsZW1lbnRzIGZvciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb25zICAtLT4KLTwhLS0gVGhlc2UgZ2VuZXJhbGx5IGNhbGwgdGhlIGdlbmVyYXRlZCBhc3NlbWJsZSBzY3JpcHRzIChuYW1lZCBpbiAtLT4KLTwhLS0gJHthc3NlbWJsZVNjcmlwdE5hbWV9KSBidXQgbWF5IGFsc28gYWRkIHByZSBhbmQgcG9zdCBwcm9jZXNzaW5nIC0tPgotPCEtLSBBZGQgb25lIHRhcmdldCBmb3IgZWFjaCByb290IGVsZW1lbnQgYW5kIGVhY2ggY29uZmlndXJhdGlvbiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08dGFyZ2V0IG5hbWU9ImFzc2VtYmxlLm9yZy5lY2xpcHNlLnB0cC5tYXN0ZXIuZ3JvdXAuZ3JvdXAuZ3JvdXAiPgotCTxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImFyY2hpdmVOYW1lIiB2YWx1ZT0icHRwLW1hc3Rlci0ke3B0cEJyYW5jaFZlcnNpb259LSR7YnVpbGRJZH0uemlwIi8+Ci0JPC9hbnQ+Ci08L3RhcmdldD4KLQkKLTx0YXJnZXQgbmFtZT0iYXNzZW1ibGUub3JnLmVjbGlwc2UucGhvdHJhbi5tYXN0ZXIuZ3JvdXAuZ3JvdXAuZ3JvdXAiPgotCTxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImFyY2hpdmVOYW1lIiB2YWx1ZT0icGhvdHJhbi1tYXN0ZXItJHtwaG90cmFuQnJhbmNoVmVyc2lvbn0tJHtidWlsZElkfS56aXAiLz4KLQk8L2FudD4KLTwvdGFyZ2V0PgotCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIENoZWNrIG91dCBtYXAgZmlsZXMgZnJvbSBjb3JyZWN0IHJlcG9zaXRvcnkgLS0+Ci08IS0tIFJlcGxhY2UgdmFsdWVzIGZvciBjdnNSb290LCBwYWNrYWdlIGFuZCBtYXBWZXJzaW9uVGFnIGFzIGRlc2lyZWQuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9ImdldE1hcEZpbGVzIj4KLQk8Y29weSBmaWxlPSIke2J1aWxkZXJ9Ly4uL21hcHMvcHRwLm1hcCIgdG9kaXI9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMiLz4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzL3B0cC5tYXAiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQHB0cFRhZ0AiIHZhbHVlPSIke3B0cFRhZ30iLz4KLQk8L3JlcGxhY2U+Ci0JPGNvcHkgZmlsZT0iJHtidWlsZGVyfS8uLi9tYXBzL3Bob3RyYW4ubWFwIiB0b2Rpcj0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIvPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMvcGhvdHJhbi5tYXAiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQHBob3RyYW5UYWdAIiB2YWx1ZT0iJHtwaG90cmFuVGFnfSIvPgotCTwvcmVwbGFjZT4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHNldHVwIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InByZVNldHVwIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgc2V0dXAgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgYnVpbGQgcHJvcGVyIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RTZXR1cCI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlRmV0Y2giPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icG9zdEZldGNoIj4KLQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwYXRjaGVzQXZhaWxhYmxlIj4KLQkJPGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkZXJ9L3BhdGNoLnhtbCIvPgotCTwvY29uZGl0aW9uPgotCTxhbnRjYWxsIHRhcmdldD0iYXBwbHlQYXRjaGVzIi8+Ci08L3RhcmdldD4KLQotPHRhcmdldCBuYW1lPSJhcHBseVBhdGNoZXMiIGlmPSJwYXRjaGVzQXZhaWxhYmxlIj4KLQk8YW50IGFudGZpbGU9IiR7YnVpbGRlcn0vcGF0Y2gueG1sIi8+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwcmVHZW5lcmF0ZSI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9InBvc3RHZW5lcmF0ZSI+Ci08L3RhcmdldD4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icHJlUHJvY2VzcyI+Ci0JPHJlcGxhY2UgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zIiB2YWx1ZT0iJHt0aW1lc3RhbXB9IiB0b2tlbj0iQGJ1aWxkQCI+Ci0JCTxpbmNsdWRlIG5hbWU9IioqL2Fib3V0Lm1hcHBpbmdzIiAvPgotCTwvcmVwbGFjZT4KLQk8dW56aXAgc3JjPSIke3RhdUphcnN9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS5qYXJzIi8+Ci0JPHJlcGxhY2UgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucy9vcmcuZWNsaXBzZS5wdHAuYWl4LnBwYy9CVUlMRCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAYnVpbGRWZXJzaW9uQCIgdmFsdWU9IiR7cHRwQnJhbmNoVmVyc2lvbn0uJHt0aW1lc3RhbXB9Ii8+Ci0JPC9yZXBsYWNlPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2UucHRwLmxpbnV4LnBwYy9CVUlMRCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAYnVpbGRWZXJzaW9uQCIgdmFsdWU9IiR7cHRwQnJhbmNoVmVyc2lvbn0uJHt0aW1lc3RhbXB9Ii8+Ci0JPC9yZXBsYWNlPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Ni9CVUlMRCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAYnVpbGRWZXJzaW9uQCIgdmFsdWU9IiR7cHRwQnJhbmNoVmVyc2lvbn0uJHt0aW1lc3RhbXB9Ii8+Ci0JPC9yZXBsYWNlPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2UucHRwLmxpbnV4Lng4Nl82NC9CVUlMRCI+Ci0JCTxyZXBsYWNlZmlsdGVyIHRva2VuPSJAYnVpbGRWZXJzaW9uQCIgdmFsdWU9IiR7cHRwQnJhbmNoVmVyc2lvbn0uJHt0aW1lc3RhbXB9Ii8+Ci0JPC9yZXBsYWNlPgotCTxyZXBsYWNlIGZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMvb3JnLmVjbGlwc2UucHRwLm1hY29zeC5wcGMvQlVJTEQiPgotCQk8cmVwbGFjZWZpbHRlciB0b2tlbj0iQGJ1aWxkVmVyc2lvbkAiIHZhbHVlPSIke3B0cEJyYW5jaFZlcnNpb259LiR7dGltZXN0YW1wfSIvPgotCTwvcmVwbGFjZT4KLQk8cmVwbGFjZSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLnB0cC5tYWNvc3gueDg2L0JVSUxEIj4KLQkJPHJlcGxhY2VmaWx0ZXIgdG9rZW49IkBidWlsZFZlcnNpb25AIiB2YWx1ZT0iJHtwdHBCcmFuY2hWZXJzaW9ufS4ke3RpbWVzdGFtcH0iLz4KLQk8L3JlcGxhY2U+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icG9zdFByb2Nlc3MiPgotPC90YXJnZXQ+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwcmVBc3NlbWJsZSI+Ci08L3RhcmdldD4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwb3N0QXNzZW1ibGUiPgotPC90YXJnZXQ+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgYnVpbGQgaXMgZG9uZS4gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0YXJnZXQgbmFtZT0icG9zdEJ1aWxkIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gdG8gdGVzdCB0aGUgYnVpbGQgcmVzdWx0cyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gU3RlcHMgdG8gZG8gdG8gcHVibGlzaCB0aGUgYnVpbGQgcmVzdWx0cyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRhcmdldCBuYW1lPSJwdWJsaXNoIj4KLTwvdGFyZ2V0PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JPGVjaG8gbWVzc2FnZT0iWW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aGVuIGludm9raW5nIHRoaXMgZmlsZSIgLz4KLTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9wYWNrLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9wYWNrLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjVhNWUuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGFjay5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcGFjazIwMC5kZWZhdWx0LmFyZ3M9LUU0CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9waG90cmFuX2J1aWxkc2l0ZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9waG90cmFuX2J1aWxkc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxM2U5MDIuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcGhvdHJhbl9idWlsZHNpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotCTxkZXNjcmlwdGlvbj4KLQkJUGhvdHJhbiAoRm9ydHJhbiBEZXZlbG9wbWVudCBUb29scykKLQk8L2Rlc2NyaXB0aW9uPgotICAgCTxjYXRlZ29yeS1kZWYgbmFtZT0iUGhvdHJhbiBCYXNlIERpc3RyaWJ1dGlvbiIgbGFiZWw9IlBob3RyYW4gKEZvcnRyYW4gRGV2ZWxvcG1lbnQgVG9vbHMpIi8+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJGb3J0cmFuIENvbXBpbGVyIFN1cHBvcnQiIGxhYmVsPSJGb3J0cmFuIENvbXBpbGVyIFN1cHBvcnQiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlPcHRpb25hbCBmZWF0dXJlcyBhZGRpbmcgZXJyb3IgcGFyc2VycyBhbmQgbWFuYWdlZCBidWlsZCB0b29sY2hhaW5zIGZvciB2YXJpb3VzIHZlbmRvcnMmYXBvczsgRm9ydHJhbiBjb21waWxlcnMKLQkJPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGhvdHJhbiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3Bob3RyYW4vcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5waG90cmFuXzUuMC4wLkB0aW1lU3RhbXBALmphciZhbXA7cj0xIiB2ZXJzaW9uPSI1LjAuMC5AdGltZVN0YW1wQCI+Ci0JCTxjYXRlZ29yeSBuYW1lPSJQaG90cmFuIEJhc2UgRGlzdHJpYnV0aW9uIi8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5waG90cmFuLmludGVsIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS90b29scy9wdHAvcGhvdHJhbi9yZWxlYXNlcy9nYWxpbGVvL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBob3RyYW4uaW50ZWxfNS4wLjAuQHRpbWVTdGFtcEAuamFyJmFtcDtyPTEiIHZlcnNpb249IjUuMC4wLkB0aW1lU3RhbXBAIiBvcz0ibGludXgiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBDb21waWxlciBTdXBwb3J0Ii8+Ci0JPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5waG90cmFuLnhsZiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2Fkcy9kb3dubG9hZC5waHA/ZmlsZT0vdG9vbHMvcHRwL3Bob3RyYW4vcmVsZWFzZXMvZ2FsaWxlby9mZWF0dXJlcy9vcmcuZWNsaXBzZS5waG90cmFuLnhsZl81LjAuMC5AdGltZVN0YW1wQC5qYXImYW1wO3I9MSIgdmVyc2lvbj0iNS4wLjAuQHRpbWVTdGFtcEAiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iRm9ydHJhbiBDb21waWxlciBTdXBwb3J0Ii8+Ci0JPC9mZWF0dXJlPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvcHRwYnVpbGQgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9wdHBidWlsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzNDZmNy4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZy9wdHBidWlsZAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBwdHBidWlsZCB3cmFwcGVyIHNjcmlwdAotIwotIyBVc2FnZTogcHRwYnVpbGQgWy10IHRhZ10gWy1kIGJ1aWxkX2Rpcl0gW2J1aWxkX2FyZ3NdCi0jCi0jIHdoZXJlCi0jCi0jIHRhZyBpcyB0aGUgQ1ZTIHRhZyB1c2VkIHRvIGNoZWNrIG91dCB0aGUgcmVsZW5nIHByb2plY3QgKGRlZmF1bHQgSEVBRCkKLSMgYnVpbGRfZGlyIGlzIHRoZSBsb2NhdGlvbiB0aGF0IHRoZSBidWlsZCB3aWxsIHRha2UgcGxhY2UKLSMgYnVpbGRfYXJncyBhcmUgYW55IGFyZ3VtZW50cyB5b3Ugd2FudCB0byBwYXNzIHRvIHRoZSBidWlsZCBzY3JpcHQKLSMKLSMgc2V0IHVwIGFueXRoaW5nIGVudmlyb25tZW50IHNwZWNpZmljIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUKLSMgbGF1bmNoaW5nIHRoZSBidWlsZCBzY3JpcHQgaW4gdGhlIHJlbGVuZyBwcm9qZWN0Ci0KLUxBTkc9ZW5fVVMKLVRBRz1IRUFECi1DRFRfVEFHPUhFQUQKLQotIyBtYWluIHN0YWdpbmcgZGlyZWN0b3J5Ci1CVUlMRF9ESVI9L29wdC9wdWJsaWMvZG93bmxvYWQtc3RhZ2luZy5wcml2L3Rvb2xzL3B0cC9yZWxlbmcKLQotYXJncz1gZ2V0b3B0IGQ6dDogJCpgCi0KLWlmIFsgJD8gIT0gMCBdOyB0aGVuCi0JZWNobyAidXNhZ2U6IHB0cGJ1aWxkIFstdCB0YWddIFstYyBjZHRfdGFnXSBbLWQgYnVpbGRfZGlyXSBbYnVpbGRfYXJnc10iCi0JZXhpdCAxCi1maQotCi1zZXQgLS0gJGFyZ3MKLWZvciBpCi1kbwotCWNhc2UgIiRpIgotCWluCi0JLWMpIENEVF9UQUc9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKLQktZCkgQlVJTERfRElSPSIkMiI7IHNoaWZ0OyBzaGlmdDs7Ci0JLXQpIFRBRz0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotCS0tKSBzaGlmdDsgYnJlYWs7OwotCWVzYWMKLWRvbmUKLQotQlVJTERfTE9HPSRCVUlMRF9ESVIvcHRwYnVpbGRfJHtUQUd9X2BkYXRlICslWSVtJWQlSCVNYC5sb2cKLQotewotIyBjcmVhdGUgdGhlIHJlbGVuZyBzdGFnaW5nIGRpcmVjdG9yeSBhbmQgZ28gdGhlcmUKLW1rZGlyIC1wICRCVUlMRF9ESVIgJiYgY2QgJEJVSUxEX0RJUgotCi0jIHJlbW92ZSB0aGUgb2xkIGJ1aWxkCi1ybSAtZnIgb3JnLmVjbGlwc2UucHRwCi0KLSMgQ2hlY2sgb3V0IHRoZSByZWxlbmcgcHJvamVjdAotZXhwb3J0IENWU1JPT1Q9OnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scwotY3ZzIGNvIC1yICRUQUcgLWQgb3JnLmVjbGlwc2UucHRwIG9yZy5lY2xpcHNlLnB0cC9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJlbGVuZwotCi0jIHJ1biB0aGUgbWFpbiBzY3JpcHQKLWNkIG9yZy5lY2xpcHNlLnB0cAotc2ggYnVpbGQuc2ggJCoKLQotIyBCdWlsZCBSRFQgc2VydmVyIHBhY2thZ2VzCi1jZCByZXN1bHRzL3BsdWdpbnMKLQotIyBDaGVjayBvdXQgcmR0LmNvcmUucmVtb3RlamFycywgcmR0LmNvcmUuc3R1YnMgYW5kIGNkdC5jb3JlIGZvciBzb3VyY2UKLWV4cG9ydCBDVlNST09UPTpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMKLWN2cyBjbyAtciAkVEFHIC1kIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzIG9yZy5lY2xpcHNlLnB0cC9yZHQvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMKLWN2cyBjbyAtciAkVEFHIC1kIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zdHVicyBvcmcuZWNsaXBzZS5wdHAvcmR0L29yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5zdHVicwotY3ZzIGNvIC1yICRDRFRfVEFHIC1kIG9yZy5lY2xpcHNlLmNkdC5jb3JlIG9yZy5lY2xpcHNlLmNkdC9hbGwvb3JnLmVjbGlwc2UuY2R0LmNvcmUKLQotY2Qgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMKLQotIyBydW4gdGhlIHNjcmlwdCBpbiByZW1vdGVqYXJzCi1leHBvcnQgUEFUSD0vb3B0L3B1YmxpYy9jb21tb24vaWJtLWphdmEyLXBwYy01MC9iaW46JFBBVEgKLWVjaG8gYGphdmEgLXZlcnNpb25gCi1qYXZhIC1qYXIgLi4vLi4vLi4vdG9vbHMvb3JnLmVjbGlwc2UucmVsZW5nLmJhc2VidWlsZGVyL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5qYXIgXAotCS13cyBndGsgLWFyY2ggcHBjIC1vcyBsaW51eCAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyCi0KLX0gPiRCVUlMRF9MT0cgMj4mMQotCi1pZiBncmVwIC1xICdCVUlMRCBGQUlMRUQnICRCVUlMRF9MT0c7IHRoZW4KLQllY2hvICJCVUlMRCBGQUlMRUQuIFNlZSAkQlVJTERfTE9HIGZvciBkZXRhaWxzLiIKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvdXBkYXRlX3ZlcnNpb25zIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5yZWxlbmcvdXBkYXRlX3ZlcnNpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWFhMzI4Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucmVsZW5nL3VwZGF0ZV92ZXJzaW9ucworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBzY3JpcHQgdG8gdXBkYXRlIFBUUCB2ZXJzaW9ucwotIwotIyBVc2FnZTogdXBkYXRlX3ZlcnNpb25zIHZlcnNpb24KLSMKLSMgdmVyc2lvbiAtIG5ldyB2ZXJzaW9uIHN0cmluZyAoZS5nLiAiMy4wLjEiKQotIwotIyBOb3RlOiBhICJxdWFsaWZpZXIiIHN1ZmZpeCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gdGhlIHZlcnNpb24gd2hlcmUgYXBwcm9wcmlhdGUKLSMKLQotVE1QX0RJUj0vdG1wCi0KLWlmIFsgJCMgLWx0IDEgXTsgdGhlbgotCWVjaG8gInVzYWdlOiB1cGRhdGVfdmVyc2lvbnMgdmVyc2lvbiIKLQlleGl0IDEKLWZpCi0KLXZlcnNpb249JDEKLQotRkVBVFVSRVM9IlwKLQlvcmcuZWNsaXBzZS5wdHAtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLmNvcmUtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLmV4dGVybmFsLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5tYXN0ZXIgXAotCW9yZy5lY2xpcHNlLnB0cC5wZXJmLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5wZXJmLnRhdS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGVyZi50YXUuZm9ydHJhbi1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGxkdC1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucGxkdC5sYXBpLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucmR0LWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5yZW1vdGUtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5yZW1vdGV0b29scy1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucmVtb3RlLnJzZS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucmVtb3RldG9vbHMtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJtLmlibS5sbC1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAucm0uaWJtLnBlLWZlYXR1cmUgXAotCW9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDItZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnJtLm9wZW5tcGktZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnNkbS1mZWF0dXJlIFwKLQlvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMtZmVhdHVyZSBcCi0Jb3JnLmVjbGlwc2UucHRwLnV0aWxzLWZlYXR1cmUiCi0JCi1QTFVHSU5TPSJcCi0Jb3JnLmVjbGlwc2UucHRwLmFpeC5wcGMgXAotCW9yZy5lY2xpcHNlLnB0cC5saW51eC5wcGMgXAotCW9yZy5lY2xpcHNlLnB0cC5saW51eC54ODYgXAotCW9yZy5lY2xpcHNlLnB0cC5saW51eC54ODZfNjQgXAotCW9yZy5lY2xpcHNlLnB0cC5tYWNvc3gucHBjIFwKLQlvcmcuZWNsaXBzZS5wdHAubWFjb3N4Lng4NiBcCi0Jb3JnLmVjbGlwc2UucHRwIgotCQotQ19QUk9KRUNUUz0iXAotCW9yZy5lY2xpcHNlLnB0cC5kZWJ1Zy5zZG0gXAotCW9yZy5lY2xpcHNlLnB0cC5wcm94eSBcCi0Jb3JnLmVjbGlwc2UucHRwLnV0aWxzIgotCQotdXBkYXRlX2ZlYXR1cmUoKSB7Ci0Jc2VkIC1lICJzL3ZlcnNpb249XCJbMC05XVwuWzAtOV1cLlswLTldXC5xdWFsaWZpZXJcIi92ZXJzaW9uPVwiJDJcLnF1YWxpZmllclwiLyIgPCAkMS9mZWF0dXJlLnhtbCA+ICRUTVBfRElSLyR7MX1fZmVhdHVyZS54bWwKLQltdiAkVE1QX0RJUi8kezF9X2ZlYXR1cmUueG1sICQxL2ZlYXR1cmUueG1sCi19Ci0KLXVwZGF0ZV9tYW5pZmVzdCgpIHsKLQlzZWQgLWUgInMvQnVuZGxlLVZlcnNpb246ICpbMC05XVwuWzAtOV1cLlswLTldXC5xdWFsaWZpZXIvQnVuZGxlLVZlcnNpb246ICQyLnF1YWxpZmllci8iIDwgJDEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgPiAkVE1QX0RJUi8kezF9X01BTklGRVNULk1GCi0JbXYgJFRNUF9ESVIvJHsxfV9NQU5JRkVTVC5NRiAkMS9NRVRBLUlORi9NQU5JRkVTVC5NRgotfQotCi11cGRhdGVfY29uZmlndXJlKCkgewotCXNlZCAtZSAicy9BQ19JTklUKFwoW14sXSpcKSwgKlswLTldXC5bMC05XVwuWzAtOV0pL0FDX0lOSVQoXDEsICQyKS8iIDwgJDEvY29uZmlndXJlLmluID4gJFRNUF9ESVIvJHsxfV9jb25maWd1cmUuaW4KLQltdiAkVE1QX0RJUi8kezF9X2NvbmZpZ3VyZS5pbiAkMS9jb25maWd1cmUuaW4KLQkoY2QgJDE7IGF1dG9jb25mKQotfQotCi1mb3IgZmVhdHVyZSBpbiAkRkVBVFVSRVM7IGRvCi0JZWNobyAiVXBkYXRpbmcgJGZlYXR1cmUuLi4iCi0JdXBkYXRlX2ZlYXR1cmUgJGZlYXR1cmUgJHZlcnNpb24KLWRvbmUKLQotZm9yIHBsdWdpbiBpbiAkUExVR0lOUzsgZG8KLQllY2hvICJVcGRhdGluZyAkcGx1Z2luLi4uIgotCXVwZGF0ZV9tYW5pZmVzdCAkcGx1Z2luICR2ZXJzaW9uCi1kb25lCi0KLWZvciBwcm9qZWN0IGluICRDX1BST0pFQ1RTOyBkbwotCWVjaG8gIlVwZGF0aW5nICRwcm9qZWN0Li4uIgotCXVwZGF0ZV9tYW5pZmVzdCAkcHJvamVjdCAkdmVyc2lvbgotCXVwZGF0ZV9jb25maWd1cmUgJHByb2plY3QgJHZlcnNpb24KLWRvbmUKLQotZWNobyAiVXBkYXRpbmcgb3JnLmVjbGlwc2UucHRwLnJlbGVuZy4uLiIKLXNlZCAtZSAicy88cHJvcGVydHkgbmFtZT1cImJyYW5jaFZlcnNpb25cIiB2YWx1ZT1cIlswLTldXC5bMC05XVwuWzAtOV1cIlwvPi88cHJvcGVydHkgbmFtZT1cImJyYW5jaFZlcnNpb25cIiB2YWx1ZT1cIiR2ZXJzaW9uXCJcLz4vIiA8IG9yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sID4gJFRNUF9ESVIvb3JnLmVjbGlwc2UucHRwLnJlbGVuZ19idWlsZC54bWwKLW12ICRUTVBfRElSL29yZy5lY2xpcHNlLnB0cC5yZWxlbmdfYnVpbGQueG1sIG9yZy5lY2xpcHNlLnB0cC5yZWxlbmcvYnVpbGQueG1sCi0KLWVjaG8gIlVwZGF0aW5nIG9yZy5lY2xpcHNlLnB0cC5yZHQuY29yZS5yZW1vdGVqYXJzLi4uIgotc2VkIC1lICJzLzxwcm9wZXJ0eSBuYW1lPVwicHRwVmVyc2lvblwiIHZhbHVlPVwiWzAtOV1cLlswLTldXC5bMC05XVwiXC8+Lzxwcm9wZXJ0eSBuYW1lPVwicHRwVmVyc2lvblwiIHZhbHVlPVwiJHZlcnNpb25cIlwvPi8iIDwgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMvYnVpbGQueG1sID4gJFRNUF9ESVIvb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnNfYnVpbGQueG1sCi1tdiAkVE1QX0RJUi9vcmcuZWNsaXBzZS5wdHAucmR0LmNvcmUucmVtb3RlamFyc19idWlsZC54bWwgb3JnLmVjbGlwc2UucHRwLnJkdC5jb3JlLnJlbW90ZWphcnMvYnVpbGQueG1sCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MWViN2IuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZGY4Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjA5OTMuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIEJsdWUgR2VuZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgdGhlIEJsdWUgR2VuZSBzeXN0ZW0KLQotIyBjb3B5cmlnaHQKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi1JQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDY5NTkuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5pYm0uYmx1ZWdlbmUucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmlibS5ibHVlZ2VuZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uaWJtLmJsdWVnZW5lLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTZkZmYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZGY4Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2VwbC12MTAuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjYyNjcuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIExTRgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZSBQVFAgVXBkYXRlIFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFkZHMgc3VwcG9ydCBmb3IgdGhlIExTRiBqb2Igc2NoZWR1bGVyCi0KLSMgY29weXJpZ2h0Ci1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG5cCi1UaGlzIG1hdGVyaWFsIHdhcyBwcm9kdWNlZCB1bmRlciBVLlMuIEdvdmVybm1lbnQgY29udHJhY3QgVy03NDA1LUVORy0zNlxuXAotZm9yIExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMgb3BlcmF0ZWQgYnkgdGhlIFVuaXZlcnNpdHlcblwKLW9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRW5lcmd5LiBUaGUgVS5TLiBHb3Zlcm5tZW50IGhhc1xuXAotcmlnaHRzIHRvIHVzZSwgcmVwcm9kdWNlLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiBORUlUSEVSIFRIRVxuXAotR09WRVJOTUVOVCBOT1IgVEhFIFVOSVZFUlNJVFkgTUFLRVMgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQsIE9SXG5cCi1BU1NVTUVTIEFOWSBMSUFCSUxJVFkgRk9SIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4gSWYgc29mdHdhcmUgaXMgbW9kaWZpZWRcblwKLXRvIHByb2R1Y2UgZGVyaXZhdGl2ZSB3b3Jrcywgc3VjaCBtb2RpZmllZCBzb2Z0d2FyZSBzaG91bGQgYmUgY2xlYXJseSBtYXJrZWQsXG5cCi1zbyBhcyBub3QgdG8gY29uZnVzZSBpdCB3aXRoIHRoZSB2ZXJzaW9uIGF2YWlsYWJsZSBmcm9tIExBTkwuXG5cCi1cblwKLUFkZGl0aW9uYWxseSwgdGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotTEEtQ0MgMDQtMTE1XG4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLmxzZi1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg1NTFmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubHNmIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy9wdHAiPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5wcm94eS5wcm90b2NvbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5sc2YuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5sc2YucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5sc2YudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ubHNmLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5sc2YtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS8ucHJvamVjdCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg0ZGVkLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzlkZjhmLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjODg3Zi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAKLSMgVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzYgCi0jIGZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5IAotIyBvZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXMgCi0jIHJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEUgCi0jIEdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUiAKLSMgQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkIAotIyB0byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLCAKLSMgc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLgotIyAKLSMgQWRkaXRpb25hbGx5LCB0aGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIExBLUNDIDA0LTExNQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIE9wZW4gTVBJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QWRkcyBzdXBwb3J0IGZvciBPcGVuIE1QSQotCi0jIGNvcHlyaWdodAotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuXAotVGhpcyBtYXRlcmlhbCB3YXMgcHJvZHVjZWQgdW5kZXIgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0IFctNzQwNS1FTkctMzZcblwKLWZvciBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIHdoaWNoIGlzIG9wZXJhdGVkIGJ5IHRoZSBVbml2ZXJzaXR5XG5cCi1vZiBDYWxpZm9ybmlhIGZvciB0aGUgVS5TLiBEZXBhcnRtZW50IG9mIEVuZXJneS4gVGhlIFUuUy4gR292ZXJubWVudCBoYXNcblwKLXJpZ2h0cyB0byB1c2UsIHJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4gTkVJVEhFUiBUSEVcblwKLUdPVkVSTk1FTlQgTk9SIFRIRSBVTklWRVJTSVRZIE1BS0VTIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVELCBPUlxuXAotQVNTVU1FUyBBTlkgTElBQklMSVRZIEZPUiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuIElmIHNvZnR3YXJlIGlzIG1vZGlmaWVkXG5cCi10byBwcm9kdWNlIGRlcml2YXRpdmUgd29ya3MsIHN1Y2ggbW9kaWZpZWQgc29mdHdhcmUgc2hvdWxkIGJlIGNsZWFybHkgbWFya2VkLFxuXAotc28gYXMgbm90IHRvIGNvbmZ1c2UgaXQgd2l0aCB0aGUgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSBMQU5MLlxuXAotXG5cCi1BZGRpdGlvbmFsbHksIHRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUxBLUNDIDA0LTExNVxuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWIyNTMyLi4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9ydGUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3B0cCI+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnV0aWxzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnByb3h5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLmxhdW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm9ydGUucHJveHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLm9ydGUtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5vcnRlLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+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+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlLy5wcm9qZWN0IGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFkM2Y1Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwYTc3Yi4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXA0KLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcDQotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwNCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZXBsLXYxMC5odG1sIGIvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmMmQ1ZS4uMDAwMDAwMAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSINCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIg0KLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCi0NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4NCi08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+DQotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+DQotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPg0KLTxsaW5rIHJlbD1GaWxlLUxpc3QNCi1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4NCi08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4NCi08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCi0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPg0KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4NCi0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4NCi0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4NCi0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+DQotICA8bzpQYWdlcz40PC9vOlBhZ2VzPg0KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4NCi0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPg0KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPg0KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPg0KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+DQotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPg0KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPg0KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KLSA8dzpXb3JkRG9jdW1lbnQ+DQotICA8dzpUcmFja1JldmlzaW9ucy8+DQotIDwvdzpXb3JkRG9jdW1lbnQ+DQotPC94bWw+PCFbZW5kaWZdLS0+DQotPHN0eWxlPg0KLTwhLS0NCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLw0KLUBmb250LWZhY2UNCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsNCi0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7DQotCW1zby1mb250LWNoYXJzZXQ6MDsNCi0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7DQotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOw0KLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30NCi0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8NCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsDQotCXttc28tc3R5bGUtcGFyZW50OiIiOw0KLQltYXJnaW46MGluOw0KLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCi0JZm9udC1zaXplOjEyLjBwdDsNCi0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7DQotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30NCi1wDQotCXttYXJnaW4tcmlnaHQ6MGluOw0KLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsNCi0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87DQotCW1hcmdpbi1sZWZ0OjBpbjsNCi0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOw0KLQlmb250LXNpemU6MTIuMHB0Ow0KLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsNCi0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQ0KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQNCi0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOw0KLQltYXJnaW46MGluOw0KLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCi0JZm9udC1zaXplOjguMHB0Ow0KLQlmb250LWZhbWlseTpUYWhvbWE7DQotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30NCi1AcGFnZSBTZWN0aW9uMQ0KLQl7c2l6ZTo4LjVpbiAxMS4waW47DQotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOw0KLQltc28taGVhZGVyLW1hcmdpbjouNWluOw0KLQltc28tZm9vdGVyLW1hcmdpbjouNWluOw0KLQltc28tcGFwZXItc291cmNlOjA7fQ0KLWRpdi5TZWN0aW9uMQ0KLQl7cGFnZTpTZWN0aW9uMTt9DQotLS0+DQotPC9zdHlsZT4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPg0KLQ0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+DQotDQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPg0KLTwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSDQotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwNCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UNCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQ0KLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0Pg0KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpDQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkNCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQ0KLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQNCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3INCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbg0KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQ0KLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbg0KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUNCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcg0KLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudA0KLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlDQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucw0KLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8NCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQ0KLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50DQotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuDQotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkNCi1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaA0KLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQ0KLWZvcm0uPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQ0KLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMNCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQ0KLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQNCi1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UNCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbg0KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkDQotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24NCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvDQotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcw0KLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQ0KLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMNCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcg0KLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkNCi1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQNCi1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsDQotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZA0KLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5DQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwNCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlDQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQ0KLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpDQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQNCi1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluDQotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+DQotDQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlDQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPg0KLTwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQ0KLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpDQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkNCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kDQotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQ0KLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5DQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQ0KLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsDQotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaA0KLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4NCi0NCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpDQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdA0KLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQ0KLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQNCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhDQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlDQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpDQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+DQotDQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQ0KLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQ0KLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlDQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MNCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4NCi0NCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQ0KLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMNCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQ0KLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbA0KLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwNCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQ0KLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwNCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcg0KLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZA0KLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXINCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bw0KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4NCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdA0KLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3Nlcw0KLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcg0KLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbA0KLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yDQotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQNCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQ0KLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUNCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhDQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UNCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kDQotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMNCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUNCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhDQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlDQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUw0KLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQNCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLA0KLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwNCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQ0KLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlDQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcw0KLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywNCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcg0KLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUw0KLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUg0KLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUw0KLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZDQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRg0KLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YNCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQNCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcg0KLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dA0KLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlDQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbg0KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkNCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoDQotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoDQotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQ0KLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudA0KLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yDQotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlDQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MNCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQNCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLA0KLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQ0KLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4NCi0NCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUNCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMNCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQNCi1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YNCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcw0KLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwNCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bw0KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbg0KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQ0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mDQotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mDQotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtDQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZA0KLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8NCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcg0KLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QNCi1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+DQotDQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQ0KLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YNCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMNCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzDQotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPg0KLQ0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4NCi0NCi08L2Rpdj4NCi0NCi08L2JvZHk+DQotDQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGFkOTg0Li4wMDAwMDAwCi0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotICMgQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UsTmF0aW9uYWwgVW5pdmVyc2l0eSANCi0gIyBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksQ2hhbmdzaGEsQ2hpbmEuQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtDQotICMgYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgDQotICMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwNCi0gIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICMgQ29udHJpYnV0b3JzOg0KLSAjIE5VRFQgc2Nob29sIG9mIGNvbXB1dGVyIC0gNjA1IHN0YWZmIHJvb20NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0NCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlDQotZmVhdHVyZU5hbWU9UFRQIFN1cHBvcnQgRm9yIFNMVVJNDQotDQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQ0KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZw0KLQ0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUNCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlIFBUUCBVcGRhdGUgU2l0ZQ0KLQ0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlDQotZGVzY3JpcHRpb249QWRkcyBzdXBwb3J0IGZvciBTbHVybQ0KLQ0KLSMgY29weXJpZ2h0DQotY29weXJpZ2h0PVwNCi0gICBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSBTY2hvb2wgb2YgQ29tcHV0ZXIsTmF0aW9uYWwgVW5pdmVyc2l0eSBcblwNCi0gIG9mIERlZmVuc2UgVGVjaG5vbG9neSxQLlIuQ2hpbmEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbVxuXA0KLSAgYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgXG5cDQotICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLFxuXA0KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXA0KLSAgQ29udHJpYnV0b3JzOlxuXA0KLSAgU2Nob29sIG9mIENvbXB1dGVyIC0gNjA1IHN0YWZmIHJvb20NCi0NCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSINCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UNCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbA0KLQ0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiDQotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiDQotbGljZW5zZT1cDQotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cDQotTWFyY2ggMTcsIDIwMDVcblwNCi1cblwNCi1Vc2FnZSBPZiBDb250ZW50XG5cDQotXG5cDQotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXA0KLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXA0KLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXA0KLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXA0KLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwNCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cDQotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwNCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXA0KLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwNCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXA0KLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwNCi1cblwNCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cDQotXG5cDQotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwNCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXA0KLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cDQotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cDQotXG5cDQotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cDQotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cDQotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwNCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwNCi1cblwNCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cDQotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cDQotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXA0KLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXA0KLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXA0KLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cDQotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXA0KLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cDQotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cDQotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwNCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXA0KLVxuXA0KLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXA0KLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cDQotSW5jbHVkZWQgRmVhdHVyZXMuXG5cDQotXG5cDQotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXA0KLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXA0KLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cDQotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXA0KLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwNCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwNCi1cblwNCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXA0KLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwNCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwNCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwNCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwNCi1cblwNCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cDQotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwNCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwNCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXA0KLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cDQoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXA0KLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXA0KLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXA0KLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXA0KLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXA0KLVxuXA0KLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXA0KLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXA0KLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwNCi1cblwNCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwNCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwNCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cDQotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXA0KLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXA0KLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cDQotXG5cDQotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXA0KLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cDQotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwNCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cDQotXG5cDQotQ3J5cHRvZ3JhcGh5XG5cDQotXG5cDQotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cDQotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXA0KLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwNCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwNCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cDQotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cDQotXG5cDQotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4NCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZmVhdHVyZS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmRjOWEuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvcHRwIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL3B0cC9yZWxlYXNlcy8yLjEiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnB0cC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJtLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zZWFyY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAubGF1bmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucm0udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAudXRpbHMudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wdHAucHJveHkucHJvdG9jb2wiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0tZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTEwY2YuLjAwMDAwMDAKLS0tIGEvcmVsZW5nL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+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+ICAgDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2Y2UwYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFlMzU0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNNb24gT2N0IDA2IDE0OjM2OjQ0IEdNVC0wMzowMCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Q0OTY0Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbSwKLSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+TWF5IDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LmluaSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NzYyYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDE1ZTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9OT05FCi0jIE5MU19FTkNPRElORz1VVEYtOAotCi1ibHVyYj1QVFAgTVBJQ0gyIChuZXcpIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcHRwXG4KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjFmODkuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZGF0YS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhkYjllLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL2RhdGEvZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTEFVTkNIX0NNRD1tcGlleGVjIC1sIC1hICR7TVBJQ0gyX2pvYmlkfSAke01QSUNIMl9hcmdzfSAke01QSUNIMl9lbnZ9ICR7ZXhlY1BhdGh9LyR7ZXhlY05hbWV9ICR7cHJvZ0FyZ3N9Ci1ERUJVR19DTUQ9bXBpZXhlYyAgLWwgLWEgJHtNUElDSDJfam9iaWR9ICR7TVBJQ0gyX2FyZ3N9ICR7TVBJQ0gyX2Vudn0gJHtkZWJ1Z0V4ZWNQYXRofS8ke2RlYnVnRXhlY05hbWV9ICR7ZGVidWdBcmdzfQotRElTQ09WRVJfQ01EPW1wZHRyYWNlIC1sCi1QRVJJT0RJQ19DTUQ9bXBkbGlzdGpvYnMKLVBFUklPRElDX1RJTUU9NTAwMAotUEFUSD0KLVVTRV9ERUZBVUxUUz10cnVlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9lY2xpcHNlMzIucG5nIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmYjViYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgTVBJQ0gyIChuZXcpIFN1cHBvcnQKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlNzFjNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLmNvcmUucmVzb3VyY2VNYW5hZ2VycyI+Ci0gICAgICA8cmVzb3VyY2VNYW5hZ2VyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5NUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5tcGljaDIuY29yZS5yZXNvdXJjZW1hbmFnZXIiCi0gICAgICAgICAgICBuYW1lPSJNUElDSDIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlLnJlc291cmNlTWFuYWdlcnMiPgotICAgICAgPHJlc291cmNlTWFuYWdlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnJlc291cmNlbWFuYWdlciIKLSAgICAgICAgICAgIG5hbWU9Ik1QSUNIMiAoU2VydmljZSBNb2RlbCkiPgotICAgICAgPC9yZXNvdXJjZU1hbmFnZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5wcm92aWRlcnMiPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5NUElDSDJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuTVBJQ0gyU2VydmljZVByb3ZpZGVyIgotICAgICAgICAgICAgbmFtZT0iTVBJQ0gyIgotICAgICAgICAgICAgc2VydmljZUlkPSJvcmcuZWNsaXBzZS5wdHAuY29yZS5MYXVuY2hTZXJ2aWNlIj4KLSAgICAgIDwvcHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkYTRlNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BcnJheUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RJVkVfTVBJQ0gyX0VOVl9BVFRSX0lEID0gIk1QSUNIMl9lbnYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVGRkVDVElWRV9NUElDSDJfUFJPR19BUkdTX0FUVFJfSUQgPSAiTVBJQ0gyX3Byb2dBcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRkZFQ1RJVkVfTVBJQ0gyX1dPUktJTkdfRElSX0FUVFJfSUQgPSAiTVBJQ0gyX3dvcmtpbmdEaXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmID0KLQkJbmV3IEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+KEVGRkVDVElWRV9NUElDSDJfRU5WX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBudWxsKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIEFycmF5QXR0cmlidXRlRGVmaW5pdGlvbjxTdHJpbmc+IGVmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZiA9Ci0JCW5ldyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPihFRkZFQ1RJVkVfTVBJQ0gyX1BST0dfQVJHU19BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyUHJvZ0FyZ3NBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG51bGwpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBlZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKEVGRkVDVElWRV9NUElDSDJfV09SS0lOR19ESVJfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBNUElDSDIgaGFzIHBhc3NlZCB0byB0aGUgcHJvY2Vzc2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZ2V0RWZmZWN0aXZlTVBJQ0gyRW52QXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVmZmVjdGl2ZU1QSUNIMkVudkF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogUHJvZ3JhbSBhcmd1bWVudHMgdGhhdCBNUElDSDIgaGFzIHBhc3NlZCB0byB0aGUgcHJvY2Vzc2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4gZ2V0RWZmZWN0aXZlTVBJQ0gyUHJvZ0FyZ3NBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZWZmZWN0aXZlTVBJQ0gyUHJvZ0FyZ3NBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIFdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIE1QSUNIMiBoYXMgc3RhcnRlZCB0aGUgcHJvY2Vzc2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRFZmZlY3RpdmVNUElDSDJXb3JraW5nRGlyQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkRlZmF1bHRzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWI0YjJkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkRlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkRlZmF1bHRzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBVU5DSF9DTUQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFQlVHX0NNRCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTQ09WRVJfQ01EID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJJT0RJQ19DTUQgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgaW50IFBFUklPRElDX1RJTUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBVEggPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBVU0VfREVGQVVMVFMgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0c1Jlc291cmNlUGF0aCA9ICIvZGF0YS9kZWZhdWx0cy5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWREZWZhdWx0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoID0gbmV3IFBhdGgoZGVmYXVsdHNSZXNvdXJjZVBhdGgpOwotCQlCdW5kbGUgYnVuZGxlID0gTVBJQ0gyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gcmVhZChkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBidW5kbGUpOwotCi0JCUxBVU5DSF9DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiTEFVTkNIX0NNRCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHX0NNRCA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsICJERUJVR19DTUQiKTsgLy8kTk9OLU5MUy0xJAotCQlESVNDT1ZFUl9DTUQgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiRElTQ09WRVJfQ01EIik7IC8vJE5PTi1OTFMtMSQKLQkJUEVSSU9ESUNfQ01EID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIlBFUklPRElDX0NNRCIpOyAvLyROT04tTkxTLTEkCi0JCVBFUklPRElDX1RJTUUgPSBnZXRJbnRlZ2VyKGJ1bmRsZSwgcHJvcGVydGllcywgIlBFUklPRElDX1RJTUUiKTsgLy8kTk9OLU5MUy0xJAotCQlQQVRIID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIlBBVEgiKTsgLy8kTk9OLU5MUy0xJAotCQlVU0VfREVGQVVMVFMgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRV9ERUZBVUxUUyIpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0IExBVU5DSF9DTUQgIT0gbnVsbDsKLQkJYXNzZXJ0IERFQlVHX0NNRCAhPSBudWxsOwotCQlhc3NlcnQgRElTQ09WRVJfQ01EICE9IG51bGw7Ci0JCWFzc2VydCBQRVJJT0RJQ19DTUQgIT0gbnVsbDsKLQkJYXNzZXJ0IFBBVEggIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgcmVhZChQYXRoIGRlZmF1bHRzUHJvcGVydGllc1BhdGgsIEJ1bmRsZSBidW5kbGUpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpblN0cmVhbTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCWluU3RyZWFtID0gRmlsZUxvY2F0b3Iub3BlblN0cmVhbShidW5kbGUsIGRlZmF1bHRzUHJvcGVydGllc1BhdGgsIGZhbHNlKTsKLQkJCXByb3BlcnRpZXMubG9hZChpblN0cmVhbSk7Ci0KLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBNUElDSDJQbHVnaW4uY29yZUVycm9yRXhjZXB0aW9uKE1lc3NhZ2VzLk1QSUNIMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZSwgZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyRGVmYXVsdHNfTWlzc2luZ1ZhbHVlLCBrZXkpKSk7Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRlZ2VyKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCBrZXkpOwotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkRlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlciwga2V5KSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oQnVuZGxlIGJ1bmRsZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhidW5kbGUsIHByb3BlcnRpZXMsIGtleSk7Ci0JCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gySm9iQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gySm9iQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTExMGRmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkpvYkF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0KLS8qKgotICogTm9kZSBhdHRyaWJ1dGVzLgotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gySm9iQXR0cmlidXRlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX0lEX0FUVFJfSUQgPSAiTVBJQ0gyX2pvYmlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUTkFNRV9BVFRSX0lEID0gIk1QSUNIMl9ob3N0bmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gam9iSWRBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSk9CX0lEX0FUVFJfSUQsIE1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gaG9zdG5hbWVBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oSE9TVE5BTUVfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gySm9iQXR0cmlidXRlc19ob3N0bmFtZUF0dHJEZWZfdGl0bGUsIAotCQkJCU1lc3NhZ2VzLk1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRKb2JJZEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBqb2JJZEF0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGdldEhvc3RuYW1lQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGhvc3RuYW1lQXR0ckRlZjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVEZWZpbml0aW9uPD8sPyw/PltdIGdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBJQXR0cmlidXRlRGVmaW5pdGlvbltde2pvYklkQXR0ckRlZiwgaG9zdG5hbWVBdHRyRGVmfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMwZGEyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BcnJheUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIE9NUEktc3BlY2lmaWMgYXR0cmlidXRlcwotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hfQVJHU19BVFRSX0lEID0gIk1QSUNIMl9hcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfS0VZU19BVFRSX0lEID0gIk1QSUNIMl9lbnZLZXlzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfQVJHU19BVFRSX0lEID0gIk1QSUNIMl9lbnYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uIGxhdW5jaEFyZ3NBdHRyRGVmID0KLQkJbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oTEFVTkNIX0FSR1NfQVRUUl9JRCwgTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2xhdW5jaEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uLCBmYWxzZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBlbnZpcm9ubWVudEtleUF0dHJEZWYgPSBuZXcgQXJyYXlBdHRyaWJ1dGVEZWZpbml0aW9uPFN0cmluZz4oCi0JCQlFTlZfS0VZU19BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50S2V5QXR0ckRlZl90aXRsZSwKLQkJCU1lc3NhZ2VzLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX2Rlc2NyaXB0aW9uLCBmYWxzZSwKLQkJCW5ldyBTdHJpbmdbMF0pOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBlbnZpcm9ubWVudEFyZ3NBdHRyRGVmID0gbmV3IFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24oCi0JCQlFTlZfQVJHU19BVFRSX0lELCBNZXNzYWdlcy5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfdGl0bGUsIE1lc3NhZ2VzLk1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbiwgZmFsc2UsCi0JIiR7TVBJQ0gyX2VudktleXM6OiAteCA6Oi14IDp9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3Qgb2YgbmFtZXMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgYXBwbGljYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnJheUF0dHJpYnV0ZURlZmluaXRpb248U3RyaW5nPiBnZXRFbnZpcm9ubWVudEtleXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gZW52aXJvbm1lbnRLZXlBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCBhcyBleHBlY3RlZCBieSBvcGVubXBpIGNvbW1hbmQgbGluZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb24gZ2V0RW52aXJvbm1lbnRBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGVudmlyb25tZW50QXJnc0F0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogQXJndW1lbnRzIGZvciB0aGUgYXBwbGljYXRpb24sIGFzIGV4cGVjdGVkIGJ5IG9wZW5tcGkgY29tbWFuZCBsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRMYXVuY2hBcmd1bWVudHNBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gbGF1bmNoQXJnc0F0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXsKLQkJCQlsYXVuY2hBcmdzQXR0ckRlZixlbnZpcm9ubWVudEFyZ3NBdHRyRGVmLGVudmlyb25tZW50S2V5QXR0ckRlZgotCQl9OwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJNYWNoaW5lQXR0cmlidXRlcy5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4YjUxYi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJNYWNoaW5lQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBOb2RlIGF0dHJpYnV0ZXMKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19NRVNTQUdFID0gIk1QSUNIMl9zdGF0dXNNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdGF0dXNNZXNzYWdlQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNUQVRVU19NRVNTQUdFLCBNZXNzYWdlcy5NUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdGF0dXMgbWVzc2FnZSBpZiBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2NvdmVyIHRoZSBtYWNoaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXR1c01lc3NhZ2VBdHRyRGVmOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117c3RhdHVzTWVzc2FnZUF0dHJEZWZ9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTm9kZUF0dHJpYnV0ZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMk5vZGVBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjFiOTYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyTm9kZUF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIE5vZGUgYXR0cmlidXRlcwotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJOb2RlQXR0cmlidXRlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNX05PREVTX0lEID0gIk1QSUNIMl9udW1Ob2RlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX05VTV9OT0RFU19JRCA9ICJNUElDSDJfbWF4TnVtTm9kZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19NRVNTQUdFID0gIk1QSUNIMl9zdGF0dXNNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSU1VCU0NSSUJFRCA9ICJNUElDSDJfb3ZlcnN1YnNjcmliZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1Ob2Rlc0F0dHJEZWYgPQotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTlVNX05PREVTX0lELCBNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGUsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbnVtTm9kZXNBdHRyRGVmX2Rlc2NyaXB0aW9uLCB0cnVlLCBuZXcgSW50ZWdlcigwKSk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBtYXhOdW1Ob2Rlc0F0dHJEZWYgPQotCQluZXcgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24oTUFYX05VTV9OT0RFU19JRCwgTWVzc2FnZXMuTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbWF4TnVtTm9kZXNBdHRyRGVmX3RpdGxlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgbmV3IEludGVnZXIoMCkpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBzdGF0dXNNZXNzYWdlQXR0ckRlZiA9Ci0JCW5ldyBTdHJpbmdBdHRyaWJ1dGVEZWZpbml0aW9uKFNUQVRVU19NRVNTQUdFLCBNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbiwgdHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBvdmVyc3Vic2NyaWJlZEF0dHJEZWYgPQotCQluZXcgQm9vbGVhbkF0dHJpYnV0ZURlZmluaXRpb24oT1ZFUlNVQlNDUklCRUQsIE1lc3NhZ2VzLk1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJOb2RlQXR0cmlidXRlc19vdmVyc3Vic2NyaWJlZEF0dHJEZWZfZGVzY3JpcHRpb24sIHRydWUsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0KLQkvKioKLQkgKiBOdW1iZXIgb2Ygc2xvdHMgc3VnZ2VzdGVkIG9uIHRoZSBub2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0TnVtYmVyT2ZOb2Rlc0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudW1Ob2Rlc0F0dHJEZWY7Ci0JfQotCi0JLyoqCi0JICogTWF4aW1hbCBudW1iZXIgb2Ygc2xvdHMgb24gdGhlIG5vZGUuIFplcm8gaWYgbm90IHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldE1heGltYWxOdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIG1heE51bU5vZGVzQXR0ckRlZjsKLQl9Ci0KLQkvKioKLQkgKiBTdGF0dXMgbWVzc2FnZSBpZiBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2NvdmVyIHRoZSBub2RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHN0YXR1c01lc3NhZ2VBdHRyRGVmOwotCX0KLQotCS8qKgotCSAqIElmIG5vZGUgaXMgb3ZlcnN1YnNjcmliZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRPdmVyc3Vic2NyaWJlZEF0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBvdmVyc3Vic2NyaWJlZEF0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlRGVmaW5pdGlvbjw/LD8sPz5bXSBnZXREZWZhdWx0QXR0cmlidXRlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgSUF0dHJpYnV0ZURlZmluaXRpb25bXXtudW1Ob2Rlc0F0dHJEZWYsbWF4TnVtTm9kZXNBdHRyRGVmLHN0YXR1c01lc3NhZ2VBdHRyRGVmfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQbHVnaW4uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ3NGIxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL01QSUNIMlBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlRvb2xzUk1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgTVBJQ0gyUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBNUElDSDJQbHVnaW4oKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlNUElDSDJEZWZhdWx0cy5sb2FkRGVmYXVsdHMoKTsKLQkJTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNUElDSDJQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSYWlzZSBjb3JlIGV4Y2VwdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVFeGNlcHRpb24gY29yZUVycm9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBtZXNzYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogUmFpc2UgY29yZSBleGNlcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVFeGNlcHRpb24gY29yZUVycm9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb29sc1JNUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgbWVzc2FnZSwgdCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhbiBJU3RhdHVzCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBtc2csIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYSBUaHJvd2FibGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5NUElDSDJQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3IsIGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyCi0JICogCi0JICogQHJldHVybiB1bmlxdWUgaWRlbnRpZmllciBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVJZGVudGlmaWVyKCkgewotCQlpZiAoZ2V0RGVmYXVsdCgpID09IG51bGwpCi0JCQkvLyBJZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBub3QgeWV0IGluaXRpYWxpemVkLAotCQkJLy8gcmV0dXJuIGEgc3RhdGljIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciBtdXN0Ci0JCQkvLyBtYXRjaCB0aGUgcGx1Z2luIGlkIGRlZmluZWQgaW4gcGx1Z2luLnhtbAotCQkJcmV0dXJuIFBMVUdJTl9JRDsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQcmVmZXJlbmNlTWFuYWdlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4ZGRiMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9NUElDSDJQcmVmZXJlbmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuQWJzdHJhY3RUb29sc1ByZWZlcmVuY2VNYW5hZ2VyOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0VG9vbHNQcmVmZXJlbmNlTWFuYWdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm1waWNoMi0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gTVBJQ0gyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCU1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBNUElDSDJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfTEFVTkNIX0NNRCwgTVBJQ0gyRGVmYXVsdHMuTEFVTkNIX0NNRCk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRklYICsgUFJFRlNfREVCVUdfQ01ELCBNUElDSDJEZWZhdWx0cy5ERUJVR19DTUQpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX0RJU0NPVkVSX0NNRCwgTVBJQ0gyRGVmYXVsdHMuRElTQ09WRVJfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19QRVJJT0RJQ19NT05JVE9SX0NNRCwgTVBJQ0gyRGVmYXVsdHMuUEVSSU9ESUNfQ01EKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGSVggKyBQUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUsIE1QSUNIMkRlZmF1bHRzLlBFUklPRElDX1RJTUUpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZJWCArIFBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgsIE1QSUNIMkRlZmF1bHRzLlBBVEgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjYzYjdhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGVmYXVsdHNfTWlzc2luZ1ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJFbnZBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkFwcGxpY2F0aW9uQXR0cmlidXRlc19lZmZlY3RpdmVNUElDSDJQcm9nQXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyV29ya2luZ0RpckF0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfaG9zdG5hbWVBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRSYW5nZUF0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gySm9iQXR0cmlidXRlc192cGlkU3RhcnRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFN0YXJ0QXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfZW52aXJvbm1lbnRLZXlBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19tYXhOdW1Ob2Rlc0F0dHJEZWZfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfbWF4TnVtTm9kZXNBdHRyRGVmX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfb3ZlcnN1YnNjcmliZWRBdHRyRGVmX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJOb2RlQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHROYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfZGVmYXVsdFF1ZXVlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRQYXJzZUhvc3RGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRSZWFkSG9zdEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlRW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlUGF0aE5vdEFic29sdXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRJbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRNaXNzaW5nSG9zdEZpbGVQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0RmlsZUVycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFBhcnNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZU91dHB1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkV2l0aENvZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0lnbm9yZWRJbnZhbGlkUGFyYW1ldGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9JbnZhbGlkTWF4U2xvdHNQYXJhbWV0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0ludmFsaWRTbG90c1BhcmFtZXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJEaXNjb3ZlckpvYl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkRpc2NvdmVySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyRGlzY292ZXJKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNb25pdG9ySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk1vbml0b3JKb2JfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJNb25pdG9ySm9iX3BhcnNpbmdFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTW9uaXRvckpvYl9wcm9jZXNzRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMk1vbml0b3JKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9JbnZhbGlkTGluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9NaXNzaW5nRGlzcGxheU1hcEluZm9ybWF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBUZXh0MTJQYXJzZXJfRXhjZXB0aW9uX0Jyb2tlbkRpc3BsYXlNYXBJbmZvcm1hdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX0F0dHJpYnV0ZU5vdEludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9NaXNzaW5nQXR0cmlidXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkF0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX1Vua25vd25FbGVtZW50OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJ1bnRpbWVTeXN0ZW1fSm9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9GYWlsZWRQYXJzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZXNEb05vdE1hdGNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfUHJvY2Vzc05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aEV4aXRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GYWlsZWRXaXRoU2lnbmFsOwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBQcmV2ZW50IGluc3RhbmNlcy4KLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzZDk0Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotTVBJQ0gyRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlPUZhaWxlZCB0byByZWFkIHByb3BlcnRpZXMgZmlsZSB3aXRoIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi1NUElDSDJEZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI9RmFpbGVkIHRvIHBhcnNlIGludGVnZXIgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDJEZWZhdWx0c19NaXNzaW5nVmFsdWU9TWlzc2luZyBkZWZhdWx0IHZhbHVlIGZvciB7MH0KLU1QSUNIMjEzRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlPUZhaWxlZCB0byByZWFkIHByb3BlcnRpZXMgZmlsZSB3aXRoIGRlZmF1bHQgcHJlZmVyZW5jZXMuCi1NUElDSDIxM0RlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlcj1GYWlsZWQgdG8gcGFyc2UgaW50ZWdlciBkZWZhdWx0IHZhbHVlIGZvciB7MH0KLU1QSUNIMjEzRGVmYXVsdHNfTWlzc2luZ1ZhbHVlPU1pc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgezB9Ci1NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgZW52aXJvbm1lbnQgc3VwcGxpZWQgYnkgTVBJQ0gyIHRvIGV4ZWN1dGFibGUgb24gbGF1bmNoCi1NUElDSDJBcHBsaWNhdGlvbkF0dHJpYnV0ZXNfZWZmZWN0aXZlTVBJQ0gyRW52QXR0ckRlZl90aXRsZT1FbnZpcm9ubWVudCBmb3IgTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1FZmZlY3RpdmUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBieSBNUElDSDIgc3VwcGxpZWQgdG8gZXhlY3V0YWJsZQotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMlByb2dBcmdzQXR0ckRlZl90aXRsZT1Qcm9ncmFtIEFyZ3VtZW50cyBmb3IgTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX2Rlc2NyaXB0aW9uPUVmZmVjdGl2ZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSBNUElDSDIgbGF1bmNoZWQgdGhlIHByb2Nlc3NlcwotTVBJQ0gyQXBwbGljYXRpb25BdHRyaWJ1dGVzX2VmZmVjdGl2ZU1QSUNIMldvcmtpbmdEaXJBdHRyRGVmX3RpdGxlPVdvcmtpbmcgRGlyZWN0b3J5IGZvciBNUElDSDIgcHJvY2Vzc2VzCi1NUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgam9iIGhvc3RuYW1lCi1NUElDSDJKb2JBdHRyaWJ1dGVzX2hvc3RuYW1lQXR0ckRlZl90aXRsZT1NUElDSDIgaG9zdG5hbWUKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBtYXBwaW5nIG1vZGUKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbWFwcGluZ01vZGVBdHRyRGVmX3RpdGxlPU1QSUNIMiBtYXBwaW5nIG1vZGUKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBqb2IgaWQKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfbXBpSm9iSWRBdHRyRGVmX3RpdGxlPU1QSUNIMiBqb2IgaWQKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFJhbmdlQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgdnBpZCByYW5nZQotTVBJQ0gySm9iQXR0cmlidXRlc192cGlkUmFuZ2VBdHRyRGVmX3RpdGxlPU1QSUNIMiB2cGlkIHJhbmdlCi1NUElDSDJKb2JBdHRyaWJ1dGVzX3ZwaWRTdGFydEF0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIHZwaWQgc3RhcnQKLU1QSUNIMkpvYkF0dHJpYnV0ZXNfdnBpZFN0YXJ0QXR0ckRlZl90aXRsZT1NUElDSDIgdnBpZCBzdGFydAotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEFyZ3NBdHRyRGVmX2Rlc2NyaXB0aW9uPUNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgZWFjaCBNUElDSDIgcHJvY2Vzc2VzCi1NUElDSDJMYXVuY2hBdHRyaWJ1dGVzX2Vudmlyb25tZW50QXJnc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIEVudmlyb25tZW50IGFyZ3VtZW50cwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfZGVzY3JpcHRpb249TmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc3VwcGxpZWQgdG8gdGhlIGVhY2ggTVBJQ0gyIHByb2Nlc3NlcwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19lbnZpcm9ubWVudEtleUF0dHJEZWZfdGl0bGU9TVBJQ0gyIGVudmlyb25tZW50IHZhcmlhYmxlcwotTVBJQ0gyTGF1bmNoQXR0cmlidXRlc19sYXVuY2hBcmdzQXR0ckRlZl9kZXNjcmlwdGlvbj1Db21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBNUElDSDIKLU1QSUNIMkxhdW5jaEF0dHJpYnV0ZXNfbGF1bmNoQXJnc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIGFyZ3VtZW50cwotTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfZGVzY3JpcHRpb249TVBJQ0gyIHN0YXR1cyBtZXNzYWdlCi1NUElDSDJNYWNoaW5lQXR0cmlidXRlc19zdGF0dXNNZXNzYWdlQXR0ckRlZl90aXRsZT1NUElDSDIgc3RhdHVzIG1lc3NhZ2UKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgbWF4aW1hbCBudW1iZXIgb2Ygbm9kZXMgb24gdGhlIGhvc3QKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX21heE51bU5vZGVzQXR0ckRlZl90aXRsZT1NUElDSDIgbWF4aW1hbCBudW1iZXIgb2Ygbm9kZXMKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX251bU5vZGVzQXR0ckRlZl9kZXNjcmlwdGlvbj1NUElDSDIgbnVtYmVyIG9mIG5vZGVzIG9uIHRoZSBob3N0Ci1NUElDSDJOb2RlQXR0cmlidXRlc19udW1Ob2Rlc0F0dHJEZWZfdGl0bGU9TVBJQ0gyIG51bWJlciBvZiBub2RlcwotTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfb3ZlcnN1YnNjcmliZWRBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBvdmVyc3Vic2NyaWJlZCBub2RlIChtb3JlIHByb2Nlc3NlcyB0aGFuIGF2YWlsYWJsZSkKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX292ZXJzdWJzY3JpYmVkQXR0ckRlZl90aXRsZT1NUElDSDIgb3ZlcnN1YnNjcmliZWQKLU1QSUNIMk5vZGVBdHRyaWJ1dGVzX3N0YXR1c01lc3NhZ2VBdHRyRGVmX2Rlc2NyaXB0aW9uPU1QSUNIMiBzdGF0dXMgbWVzc2FnZQotTVBJQ0gyTm9kZUF0dHJpYnV0ZXNfc3RhdHVzTWVzc2FnZUF0dHJEZWZfdGl0bGU9TVBJQ0gyIHN0YXR1cyBtZXNzYWdlCi1NUElDSDJQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3I9SW50ZXJuYWwgZXJyb3IKLQotTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0RGVzY3JpcHRpb249TVBJQ0gyIFJlc291cmNlIE1hbmFnZXIKLU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdE5hbWU9TVBJQ0gyCi0KLU1QSUNIMkRpc2NvdmVySm9iX2RlZmF1bHRRdWV1ZU5hbWU9ZGVmYXVsdAotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEZhaWxlZD1FcnJvciB3aGlsZSBydW5uaW5nIGRpc2NvdmVyIGNvbW1hbmQ6IHswfS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRQYXJzZUhvc3RGaWxlPUZhaWxlZCB0byBwYXJzZSBob3N0ZmlsZSAoezB9KS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRGYWlsZWRSZWFkSG9zdEZpbGU9RmFpbGVkIHJlYWQgaG9zdGZpbGUgKHswfSkuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSG9zdEZpbGVFbXB0eT1FbXB0eSBob3N0ZmlsZSBpcyBub3QgYWxsb3dlZCAoezB9KS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRIb3N0RmlsZU5vdEZvdW5kPUZhaWxlZCBmaW5kIGhvc3RmaWxlICh7MH0pLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZEhvc3RGaWxlUGF0aE5vdEFic29sdXRlPURpc2NvdmVyIGNvbW1hbmQgaW5mb3JtZWQgYSBwYXRoIHRvIGhvc3RmaWxlIHRoYXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGggKHswfSkuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kSW50ZXJuYWxFcnJvcj1JbnRlcm5hbCBlcnJvciB3aGlsZSBydW5uaW5nIGRpc2NvdmVyIGNvbW1hbmQ6IHswfQotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0Rpc2NvdmVyQ29tbWFuZE1pc3NpbmdIb3N0RmlsZVBhdGg9RGlzY292ZXIgY29tbWFuZCBkaWQgbm90IGluZm9ybSBwYXRoIHRvIGRlZmF1bHQgaG9zdGZpbGUuIElmIG5lY2Vzc2FyeSwgc2V0IE1DQSBwYXJhbWV0ZXJzIHRvIGRlZmluZSBkZWZhdWx0IGhvc3RmaWxlIHBhdGguCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVFcnJvcnM9VGhlcmUgYXJlIGVycm9ycyBpbiB0aGUgaG9zdGZpbGUuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yPVBhcnNlIGVycm9yKHMpIGluIGhvc3RmaWxlLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZD1GYWlsZWQgdG8gcnVuIGNvbW1hbmQgdG8gZ2V0IGhvc3RuYW1lLgotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0hvc3RuYW1lQ29tbWFuZEZhaWxlZFBhcnNlPUZhaWxlZCB0byBwYXJzZSBjb21tYW5kIGZvciBob3N0bmFtZS4KLU1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZUNvbW1hbmRGYWlsZWRQYXJzZU91dHB1dD1GYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IG9mIGRpc2NvdmVyIGNvbW1hbmQuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdG5hbWVDb21tYW5kRmFpbGVkV2l0aENvZGU9Q29tbWFuZCB0byBnZXQgaG9zdG5hbWUgZmFpbGVkIHdpdGggZXhpdCBjb2RlIHswfQotTVBJQ0gyRGlzY292ZXJKb2JfRXhjZXB0aW9uX0lnbm9yZWRJbnZhbGlkUGFyYW1ldGVyPUludmFsaWQgcGFyYW1ldGVyIHdhcyBpZ25vcmVkIGZvciB0aGlzIGhvc3QuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSW52YWxpZE1heFNsb3RzUGFyYW1ldGVyPUludmFsaWQgJ21heC1zbG90cycgcGFyYW1ldGVyIHdhcyBpZ25vcmVkIGZvciB0aGlzIGhvc3QuCi1NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSW52YWxpZFNsb3RzUGFyYW1ldGVyPUludmFsaWQgJ3Nsb3RzL2NwdXMvY291bnQnIHBhcmFtZXRlciB3YXMgaWdub3JlZCBmb3IgdGhpcyBob3N0LgotTVBJQ0gyRGlzY292ZXJKb2JfaW50ZXJydXB0ZWRFcnJvck1lc3NhZ2U9SW50ZXJydXB0ZWQgd2hpbGUgcnVubmluZyBNUElDSDIgZGlzY292ZXIgY29tbWFuZC4KLU1QSUNIMkRpc2NvdmVySm9iX25hbWU9RGlzY292ZXIgTVBJQ0gyIG9uIHswfQotTVBJQ0gyRGlzY292ZXJKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZT1GYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IG9mIE1QSUNIMiBkaXNjb3ZlciBjb21tYW5kLgotTVBJQ0gyRGlzY292ZXJKb2JfcHJvY2Vzc0Vycm9yTWVzc2FnZT1GYWlsZWQgdG8gY3JlYXRlIHJlbW90ZSBwcm9jZXNzIGZvciBNUElDSDIgZGlzY292ZXIgY29tbWFuZC4KLQotTVBJQ0gyUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fSW52YWxpZExpbmU9SW52YWxpZCBvdXRwdXQgZnJvbSBNUElDSDI6IHswfQotTVBJQ0gyUHJvY2Vzc01hcFRleHQxMlBhcnNlcl9FeGNlcHRpb25fTWlzc2luZ0Rpc3BsYXlNYXBJbmZvcm1hdGlvbj1PdXRwdXQgZnJvbSBNUElDSDIgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHByb2Nlc3NlcyBhbmQgbm9kZXMuCi1NUElDSDJQcm9jZXNzTWFwVGV4dDEyUGFyc2VyX0V4Y2VwdGlvbl9Ccm9rZW5EaXNwbGF5TWFwSW5mb3JtYXRpb249SW5jb21wbGV0ZSBvdXRwdXQgZnJvbSBNUElDSDIuCi0KLU1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fQXR0cmlidXRlTm90SW50ZWdlcj1BdHRyaWJ1dGUgezB9IGlzIG5vdCBhbiB2YWxpZCBpbnRlZ2VyICh7MX0pCi1NUElDSDJQcm9jZXNzTWFwWG1sMTNQYXJzZXJfRXhjZXB0aW9uX01pc3NpbmdBdHRyaWJ1dGU9TWlzc2luZyBYTUwgYXR0cmlidXRlOiB7MH0KLU1QSUNIMlByb2Nlc3NNYXBYbWwxM1BhcnNlcl9FeGNlcHRpb25fVW5rbm93bkF0dHJpYnV0ZT1Vbmtub3duIFhNTCBhdHRyaWJ1dGU6IHswfQotTVBJQ0gyUHJvY2Vzc01hcFhtbDEzUGFyc2VyX0V4Y2VwdGlvbl9Vbmtub3duRWxlbWVudD1Vbmtub3duIFhNTCBlbGVtZW50OiB7MH0KLQotTVBJQ0gyUnVudGltZVN5c3RlbV9Kb2JOYW1lPU1QSUNIMiBKb2IKLU1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfRXhjZXB0aW9uX0ZhaWxlZFBhcnNlPUZhaWxlZCB0byBwYXJzZSBNUElDSDIgcnVuIGNvbW1hbmQgb3V0cHV0LgotTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fSG9zdG5hbWVzRG9Ob3RNYXRjaD1Ib3N0bmFtZXMgZnJvbSBNUElDSDIgb3V0cHV0IGRvIG5vdCBtYXRjaCBleHBlY3RlZCBob3N0bmFtZS4KLU1QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2JfUHJvY2Vzc05hbWU9TVBJQ0gyIHJ1bgotCi1NUElDSDJNb25pdG9ySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlPUludGVycnVwdGVkIHdoaWxlIHJ1bm5pbmcgTVBJQ0gyIG1vbml0b3IgY29tbWFuZC4KLU1QSUNIMk1vbml0b3JKb2JfbmFtZT1Nb25pdG9yIE1QSUNIMiBvbiB7MH0KLU1QSUNIMk1vbml0b3JKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZT1GYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IG9mIE1QSUNIMiBtb25pdG9yIGNvbW1hbmQuCi1NUElDSDJNb25pdG9ySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2U9RmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgcHJvY2VzcyBmb3IgTVBJQ0gyIG1vbml0b3IgY29tbWFuZC4KLU1QSUNIMk1vbml0b3JKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQ9RXJyb3Igd2hpbGUgcnVubmluZyBjb21tYW5kOiB7MH0uCi1NUElDSDJNb25pdG9ySm9iX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yIHdoaWxlIHJ1bm5pbmcgY29tbWFuZDogezB9Ci1NUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9FeGVjdXRpb25GYWlsZWRXaXRoRXhpdFZhbHVlPUpvYiB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgd2l0aCBleGl0IHZhbHVlIHswfS4gVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IG9uZSBvciBtb3JlIHByb2Nlc3NlcyBleGl0aW5nIHdpdGggYSBub24temVybyBleGl0IGNvZGUsIG9yIGV4aXRpbmcgYmVmb3JlIGNhbGxpbmcgTVBJX0ZpbmFsaXplLgotTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aFNpZ25hbD1Kb2IgdGVybWluYXRlZCBhYm5vcm1hbGx5IGR1ZSB0byBzaWduYWwgezB9LiBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgb25lIG9yZSBtb3JlIHByb2Nlc3NlcyBleGl0aW5nIGR1ZSB0byB0aGlzIHNpZ25hbC4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL0VmZmVjdGl2ZU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4ZWI2Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9FZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLklUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFZmZlY3RpdmVNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGV4dGVuZHMKLUFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiB7Ci0KLQlwdWJsaWMgRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbigKLQkJCUlUb29sUk1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc3VwZXIoY29uZmlndXJhdGlvbik7Ci0JCUlNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIE1QSUNIMmNvbmZpZ3VyYXRpb24gPSAoSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pY29uZmlndXJhdGlvbjsKLQkJU3RyaW5nIGxhdW5jaENtZCA9IG51bGw7Ci0JCVN0cmluZyBkZWJ1Z0NtZCA9IG51bGw7Ci0JCVN0cmluZyBkaXNjb3ZlckNtZCA9IG51bGw7Ci0JCVN0cmluZyBwZXJpb2RpY0NtZCA9IG51bGw7Ci0JCWludCBwZXJpb2RpY1RpbWUgPSAwOwotCQlTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBudWxsOwotCQlpZiAoTVBJQ0gyY29uZmlndXJhdGlvbi5nZXRVc2VUb29sRGVmYXVsdHMoKSkgewotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOwotCQkJbGF1bmNoQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0xBVU5DSF9DTUQpOwotCQkJZGVidWdDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKTsKLQkJCWRpc2NvdmVyQ21kID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCk7Ci0JCQlwZXJpb2RpY0NtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX0NNRCk7Ci0JCQlwZXJpb2RpY1RpbWUgPSBwcmVmZXJlbmNlcy5nZXRJbnQoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUEVSSU9ESUNfTU9OSVRPUl9USU1FKTsKLQkJfSBlbHNlIHsKLQkJCWxhdW5jaENtZCA9IE1QSUNIMmNvbmZpZ3VyYXRpb24uZ2V0TGF1bmNoQ21kKCk7Ci0JCQlkZWJ1Z0NtZCA9IE1QSUNIMmNvbmZpZ3VyYXRpb24uZ2V0RGVidWdDbWQoKTsKLQkJCWRpc2NvdmVyQ21kID0gTVBJQ0gyY29uZmlndXJhdGlvbi5nZXREaXNjb3ZlckNtZCgpOwotCQkJcGVyaW9kaWNDbWQgPSBNUElDSDJjb25maWd1cmF0aW9uLmdldFBlcmlvZGljTW9uaXRvckNtZCgpOwotCQkJcGVyaW9kaWNUaW1lID0gTVBJQ0gyY29uZmlndXJhdGlvbi5nZXRQZXJpb2RpY01vbml0b3JUaW1lKCk7Ci0JCX0KLQkJcmVtb3RlSW5zdGFsbFBhdGggPSBNUElDSDJjb25maWd1cmF0aW9uLmdldFJlbW90ZUluc3RhbGxQYXRoKCk7Ci0JCWFwcGx5VmFsdWVzKGxhdW5jaENtZCwgZGVidWdDbWQsIGRpc2NvdmVyQ21kLCBwZXJpb2RpY0NtZCwgcGVyaW9kaWNUaW1lLCBudWxsLCByZW1vdGVJbnN0YWxsUGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhNDhlNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uSVRvb2xSTUNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJVG9vbFJNQ29uZmlndXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBpbnQgTVBJQ0gyX0NBUEFCSUxJVElFUyA9IENBUF9MQVVOQ0ggfCBDQVBfRElTQ09WRVIgfCBDQVBfUEVSSU9ESUNfTU9OSVRPUiB8IENBUF9SRU1PVEVfSU5TVEFMTF9QQVRIOwotCi0JLyoqCi0JICogR2V0IHRoZSB2ZXJzaW9uIHNlbGVjdGVkIHdoZW4gY29uZmlndXJpbmcgdGhlIFJNCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBNUElDSDIgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZlcnNpb24gdGhhdCBpcyBzZWxlY3RlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBSTQotCSAqIAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgTVBJQ0gyIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ybXN5c3RlbS9NUElDSDJSTVNlcnZpY2VQcm92aWRlckZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJNU2VydmljZVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc4NTdhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJNU2VydmljZVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZS5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLlNlcnZpY2VNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgdG8gYnJpZGdlIGJldHdlZW4gdGhlIG9sZCBSTSBmYWN0b3J5IG1vZGVsIGFuZCB0aGUgbmV3IFJNcyBiYWNrZWQKLSAqIGJ5IHNlcnZpY2UgY29uZmlndXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgZ3JlZwotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJNU2VydmljZVByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSTV9GQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnJlc291cmNlbWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX1NFUlZJQ0UgPSAib3JnLmVjbGlwc2UucHRwLmNvcmUuTGF1bmNoU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVBJQ0gyX1NFUlZJQ0VfUFJPVklERVIgPSAib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuTVBJQ0gyU2VydmljZVByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVU5JUVVFX05BTUUgPSAidW5pcU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVNlcnZpY2VNb2RlbE1hbmFnZXIgZlNlcnZpY2VNYW5hZ2VyID0gU2VydmljZU1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSNjb3B5Q29uZmlndXJhdGlvbihvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvcHlDb25maWd1cmF0aW9uKAotCQkJSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlyZXR1cm4gKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKWNvbmZpZ3VyYXRpb24uY2xvbmUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3RvcnkjY3JlYXRlKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlQVFBDb3JlUGx1Z2luIHBsdWdpbiA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlJUFVuaXZlcnNlQ29udHJvbCB1bml2ZXJzZSA9IChJUFVuaXZlcnNlQ29udHJvbCkgcGx1Z2luLmdldFVuaXZlcnNlKCk7Ci0JCXJldHVybiBuZXcgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyKEludGVnZXIudmFsdWVPZih1bml2ZXJzZS5nZXROZXh0UmVzb3VyY2VNYW5hZ2VySWQoKSksIHVuaXZlcnNlLCBjb25maWcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSNjcmVhdGVDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpIHsKLQkJSVNlcnZpY2VDb25maWd1cmF0aW9uIGNvbmZpZyA9IGZTZXJ2aWNlTWFuYWdlci5uZXdTZXJ2aWNlQ29uZmlndXJhdGlvbihNZXNzYWdlcy5NUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHROYW1lKTsKLQkJSVNlcnZpY2Ugc2VydmljZSA9IGZTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKExBVU5DSF9TRVJWSUNFKTsKLQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCQkJSVNlcnZpY2VQcm92aWRlckRlc2NyaXB0b3IgZGVzYyA9IHNlcnZpY2UuZ2V0UHJvdmlkZXJEZXNjcmlwdG9yKE1QSUNIMl9TRVJWSUNFX1BST1ZJREVSKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gZlNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2VQcm92aWRlcihkZXNjKTsKLQkJCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm92aWRlcikgewotCQkJCQkoKEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyKXByb3ZpZGVyKS5zZXRVbmlxdWVOYW1lKGNvbmZpZy5nZXRJZCgpKTsKLQkJCQkJY29uZmlnLnNldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlLCBwcm92aWRlcik7Ci0JCQkJCXJldHVybiAoQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJvdmlkZXIpcHJvdmlkZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZTZXJ2aWNlTWFuYWdlci5yZW1vdmUoY29uZmlnKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2xvYWRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBsb2FkQ29uZmlndXJhdGlvbihJTWVtZW50byBtZW1lbnRvKSB7Ci0JCVN0cmluZyBzZXJ2aWNlQ29uZmlnSWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfVU5JUVVFX05BTUUpOwotCQlpZiAoc2VydmljZUNvbmZpZ0lkICE9IG51bGwpIHsKLQkJCUlTZXJ2aWNlQ29uZmlndXJhdGlvbiBjb25maWcgPSBmU2VydmljZU1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbihzZXJ2aWNlQ29uZmlnSWQpOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJSVNlcnZpY2Ugc2VydmljZSA9IGZTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKExBVU5DSF9TRVJWSUNFKTsKLQkJCQlJU2VydmljZVByb3ZpZGVyIHByb3ZpZGVyID0gY29uZmlnLmdldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlKTsKLQkJCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm92aWRlcikgewotCQkJCQlyZXR1cm4gKEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyKXByb3ZpZGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I3NhdmVDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDb25maWd1cmF0aW9uKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXJDb250cm9sIHJlc291cmNlTWFuYWdlcikgewotCQlJU2VydmljZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gZlNlcnZpY2VNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbi5nZXRVbmlxdWVOYW1lKCkpOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCUlTZXJ2aWNlIHNlcnZpY2UgPSBmU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShMQVVOQ0hfU0VSVklDRSk7Ci0JCQlpZiAoY29uZmlndXJhdGlvbiBpbnN0YW5jZW9mIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyKSB7Ci0JCQkJY29uZmlnLnNldFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlLCAoSVNlcnZpY2VQcm92aWRlciljb25maWd1cmF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXNvdXJjZU1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlY2FlY2IuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW07Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLkFic3RyYWN0VG9vbHNBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLkFic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtLk1QSUNIMlJ1bnRpbWVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJlc291cmNlTWFuYWdlciBleHRlbmRzIEFic3RyYWN0VG9vbFJlc291cmNlTWFuYWdlciB7Ci0KLQlwcml2YXRlIEludGVnZXIgTVBJQ0gyX1JNSUQ7Ci0JcHJpdmF0ZSBNUElDSDJSdW50aW1lU3lzdGVtIHJ0cyA9IG51bGw7Ci0KLQlwdWJsaWMgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyKEludGVnZXIgaWQsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlLCBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoaWQudG9TdHJpbmcoKSwgdW5pdmVyc2UsIGNvbmZpZyk7Ci0JCU1QSUNIMl9STUlEID0gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyI2RvQ3JlYXRlUnVudGltZVN5c3RlbSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElSdW50aW1lU3lzdGVtIGRvQ3JlYXRlUnVudGltZVN5c3RlbSgpIHsKLQkJSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gKElNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBnZXRDb25maWd1cmF0aW9uKCk7Ci0JCUF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyIGF0dHJEZWZNZ3IgPSBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpOwotCQlhdHRyRGVmTWdyLnNldEF0dHJpYnV0ZURlZmluaXRpb25zKEFic3RyYWN0VG9vbHNBdHRyaWJ1dGVzLmdldERlZmF1bHRBdHRyaWJ1dGVEZWZpbml0aW9ucygpKTsKLQkJcnRzID0gbmV3IE1QSUNIMlJ1bnRpbWVTeXN0ZW0oTVBJQ0gyX1JNSUQsIGNvbmZpZywgYXR0ckRlZk1ncik7Ci0JCXJldHVybiBydHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTlmNTJkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJtc3lzdGVtLkFic3RyYWN0VG9vbFJNQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBleHRlbmRzCi1BYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBDbG9uZWFibGUsIElNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkVSU0lPTl9JRCA9ICJ2ZXJzaW9uSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdGF0aWMgY2xhc3MgdG8gaG9sZCBvcGVubXBpIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLQkgKgotCSAqIEBhdXRob3IgZGZmZXJiZXIKLQkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIE1QSUNIMkNvbmZpZyB7Ci0KLQkJcHJpdmF0ZSBUb29sc0NvbmZpZyB0b29sc0NvbmZpZzsKLQkJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbklkOwotCi0JCXB1YmxpYyBNUElDSDJDb25maWcoKSB7Ci0JCQl0aGlzKG5ldyBUb29sc0NvbmZpZygpLCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBNUElDSDJDb25maWcoVG9vbHNDb25maWcgdG9vbHNDb25maWcsIFN0cmluZyB2ZXJzaW9uSWQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRvb2xzQ29uZmlnID0gdG9vbHNDb25maWc7Ci0JCQl0aGlzLnZlcnNpb25JZCA9IHZlcnNpb25JZDsKLQkJfQotCi0JCXB1YmxpYyBUb29sc0NvbmZpZyBnZXRUb29sc0NvbmZpZygpIHsKLQkJCXJldHVybiB0b29sc0NvbmZpZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRvb2xzQ29uZmlnKFRvb2xzQ29uZmlnIHRvb2xzQ29uZmlnKSB7Ci0JCQl0aGlzLnRvb2xzQ29uZmlnID0gdG9vbHNDb25maWc7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25JZCgpIHsKLQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZCkgewotCQkJdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uSWQ7Ci0KLQlwdWJsaWMgc3RhdGljIE1QSUNIMkNvbmZpZyBsb2FkT3Blbk1waUNvbmZpZyhJUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LAotCQkJSU1lbWVudG8gbWVtZW50bykgewotCQlUb29sc0NvbmZpZyB0b29sc0NvbmZpZyA9IGxvYWRUb29sKGZhY3RvcnksIG1lbWVudG8pOwotCi0JCVN0cmluZyB2ZXJzaW9uSWQgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfVkVSU0lPTl9JRCk7Ci0KLQkJTVBJQ0gyQ29uZmlnIGNvbmZpZyA9IG5ldyBNUElDSDJDb25maWcodG9vbHNDb25maWcsIHZlcnNpb25JZCk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBsb2FkKAotCQkJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LCBJTWVtZW50byBtZW1lbnRvKSB7Ci0JCU1QSUNIMkNvbmZpZyBtcGljaDJDb25maWcgPSBsb2FkT3Blbk1waUNvbmZpZyhmYWN0b3J5LCBtZW1lbnRvKTsKLQkJSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IE1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24oZmFjdG9yeSwgbXBpY2gyQ29uZmlnKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihNUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIoTVBJQ0gyX0NBUEFCSUxJVElFUywgbmV3IFRvb2xzQ29uZmlnKCksIGZhY3RvcnkpOwotCi0JCVByZWZlcmVuY2VzIHByZWZzID0gTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJc2V0TGF1bmNoQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKSk7Ci0JCXNldERlYnVnQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ERUJVR19DTUQpKTsKLQkJc2V0RGlzY292ZXJDbWQocHJlZnMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX0RJU0NPVkVSX0NNRCkpOwotCQlzZXRQZXJpb2RpY01vbml0b3JDbWQocHJlZnMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfQ01EKSk7Ci0JCXNldFBlcmlvZGljTW9uaXRvclRpbWUocHJlZnMuZ2V0SW50KE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1BFUklPRElDX01PTklUT1JfVElNRSkpOwotCQlzZXRSZW1vdGVJbnN0YWxsUGF0aChwcmVmcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCkpOwotCQkvLwkJc2V0VXNlVG9vbERlZmF1bHRzKHByZWZzLmdldEJvb2xlYW4oTVBJQ0gyMTNQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDIxM1ByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1VTRV9ERUZBVUxUUykpOwotCX0KLQotCXB1YmxpYyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKE1QSUNIMlJlc291cmNlTWFuYWdlckZhY3RvcnkgZmFjdG9yeSwKLQkJCU1QSUNIMkNvbmZpZyBjb25maWcpIHsKLQkJc3VwZXIoTVBJQ0gyX0NBUEFCSUxJVElFUywgY29uZmlnLmdldFRvb2xzQ29uZmlnKCksIGZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCUNvbW1vbkNvbmZpZyBjb21tb25Db25mID0gbmV3IENvbW1vbkNvbmZpZyhnZXROYW1lKCksCi0JCQkJZ2V0RGVzY3JpcHRpb24oKSwgZ2V0VW5pcXVlTmFtZSgpLAotCQkJCWdldFJlbW90ZVNlcnZpY2VzSWQoKSwgZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCVJlbW90ZUNvbmZpZyByZW1vdGVDb25mID0gbmV3IFJlbW90ZUNvbmZpZyhjb21tb25Db25mLAotCQkJCWdldFByb3h5U2VydmVyUGF0aCgpLCBnZXRMb2NhbEFkZHJlc3MoKSwKLQkJCQlnZXRJbnZvY2F0aW9uT3B0aW9uc1N0cigpLCBnZXRPcHRpb25zKCkpOwotCQlUb29sc0NvbmZpZyB0b29sc0NvbmZpZyA9IG5ldyBUb29sc0NvbmZpZygKLQkJCQlyZW1vdGVDb25mLAotCQkJCWdldExhdW5jaENtZCgpLAotCQkJCWdldERlYnVnQ21kKCksCi0JCQkJZ2V0RGlzY292ZXJDbWQoKSwKLQkJCQlnZXRQZXJpb2RpY01vbml0b3JDbWQoKSwKLQkJCQlnZXRQZXJpb2RpY01vbml0b3JUaW1lKCksCi0JCQkJZ2V0Q29udGludW91c01vbml0b3JDbWQoKSwKLQkJCQlnZXRSZW1vdGVJbnN0YWxsUGF0aCgpLAotCQkJCWdldFVzZVRvb2xEZWZhdWx0cygpLAotCQkJCWdldFVzZUluc3RhbGxEZWZhdWx0cygpLAotCQkJCWdldENvbW1hbmRzRW5hYmxlZCgpKTsKLQkJTVBJQ0gyQ29uZmlnIG9wZW5NcGlDb25maWcgPSBuZXcgTVBJQ0gyQ29uZmlnKHRvb2xzQ29uZmlnLCBnZXRWZXJzaW9uSWQoKSk7Ci0KLQkJcmV0dXJuIG5ldyBNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKAotCQkJCShNUElDSDJSZXNvdXJjZU1hbmFnZXJGYWN0b3J5KSBnZXRGYWN0b3J5KCksIG9wZW5NcGlDb25maWcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlKG1lbWVudG8pOwotCQltZW1lbnRvLnB1dFN0cmluZyhUQUdfVkVSU0lPTl9JRCwgdmVyc2lvbklkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZUFuZERlc2MoKSB7Ci0JCVN0cmluZyBuYW1lID0gTWVzc2FnZXMuTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0TmFtZTsKLQkJU3RyaW5nIGNvbm4gPSBnZXRDb25uZWN0aW9uTmFtZSgpOwotCQlpZiAoY29ubiAhPSBudWxsICYmICFjb25uLmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQluYW1lICs9ICJAIiArIGNvbm47IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzZXROYW1lKG5hbWUpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5NUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uX2RlZmF1bHREZXNjcmlwdGlvbik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNnZXRWZXJzaW9uSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gdmVyc2lvbklkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucm1zeXN0ZW0uSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24jc2V0VmVyc2lvbklkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbklkKFN0cmluZyB2ZXJzaW9uSWQpIHsKLQkJdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTBhNmEzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBVbml2ZXJzZUNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3RvcnkjY3JlYXRlKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZJbikgewotCQlJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKElNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mSW47Ci0JCVBUUENvcmVQbHVnaW4gcGx1Z2luID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCUlQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlID0gKElQVW5pdmVyc2VDb250cm9sKSBwbHVnaW4uZ2V0VW5pdmVyc2UoKTsKLQkJcmV0dXJuIG5ldyBNUElDSDJSZXNvdXJjZU1hbmFnZXIodW5pdmVyc2UuZ2V0TmV4dFJlc291cmNlTWFuYWdlcklkKCksIHVuaXZlcnNlLCBjb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3RvcnkjY3JlYXRlQ29uZmlndXJhdGlvbigpCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbih0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3RvcnkjbG9hZENvbmZpZ3VyYXRpb24ob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWRDb25maWd1cmF0aW9uKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmV0dXJuIE1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24ubG9hZCh0aGlzLCBtZW1lbnRvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3Jtc3lzdGVtL01QSUNIMlNlcnZpY2VQcm92aWRlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyU2VydmljZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjRjNmEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcm1zeXN0ZW0vTVBJQ0gyU2VydmljZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ybXN5c3RlbS5BYnN0cmFjdFRvb2xSTVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBNUElDSDJTZXJ2aWNlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSTVNlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRzIElNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1ZFUlNJT05fSUQgPSAidmVyc2lvbklkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBBY3R1YWwgdmVyc2lvbiB0aGF0IGlzIHVzZWQgdG8gc2VsZWN0IGNvcnJlY3QgY29tbWFuZHMuIFRoaXMgdmVyc2lvbgotCSAqIG9ubHkgcGVyc2lzdHMgd2hpbGUgdGhlIFJNIGlzIHJ1bm5pbmcuCi0JICovCi0JcHJpdmF0ZSBpbnQgbWFqb3JWZXJzaW9uID0gMDsKLQlwcml2YXRlIGludCBtaW5vclZlcnNpb24gPSAwOwotCXByaXZhdGUgaW50IHNlcnZpY2VWZXJzaW9uID0gMDsKLQkKLQlwdWJsaWMgTVBJQ0gyU2VydmljZVByb3ZpZGVyKCkgewotCQlzdXBlcihNUElDSDJfQ0FQQUJJTElUSUVTKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JCXNldExhdW5jaENtZChwcmVmcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfTEFVTkNIX0NNRCkpOwotCQlzZXREZWJ1Z0NtZChwcmVmcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKSk7Ci0JCXNldERpc2NvdmVyQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19ESVNDT1ZFUl9DTUQpKTsKLQkJc2V0UGVyaW9kaWNNb25pdG9yQ21kKHByZWZzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX0NNRCkpOwotCQlzZXRQZXJpb2RpY01vbml0b3JUaW1lKHByZWZzLmdldEludChNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19QRVJJT0RJQ19NT05JVE9SX1RJTUUpKTsKLQkJc2V0UmVtb3RlSW5zdGFsbFBhdGgocHJlZnMuZ2V0U3RyaW5nKE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZJWCArIE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLlBSRUZTX1JFTU9URV9JTlNUQUxMX1BBVEgpKTsKLQl9Ci0KLQlwdWJsaWMgTVBJQ0gyU2VydmljZVByb3ZpZGVyKE1QSUNIMlNlcnZpY2VQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwcm92aWRlcik7Ci0JCXByb3ZpZGVyLnNldExhdW5jaENtZChnZXRMYXVuY2hDbWQoKSk7Ci0JCXByb3ZpZGVyLnNldERlYnVnQ21kKGdldERlYnVnQ21kKCkpOwotCQlwcm92aWRlci5zZXREaXNjb3ZlckNtZChnZXREaXNjb3ZlckNtZCgpKTsKLQkJcHJvdmlkZXIuc2V0UGVyaW9kaWNNb25pdG9yQ21kKGdldFBlcmlvZGljTW9uaXRvckNtZCgpKTsKLQkJcHJvdmlkZXIuc2V0UGVyaW9kaWNNb25pdG9yVGltZShnZXRQZXJpb2RpY01vbml0b3JUaW1lKCkpOwotCQlwcm92aWRlci5zZXRSZW1vdGVJbnN0YWxsUGF0aChnZXRSZW1vdGVJbnN0YWxsUGF0aCgpKTsKLQkJcHJvdmlkZXIuc2V0VmVyc2lvbklkKGdldFZlcnNpb25JZCgpKTsKLQkJcHJvdmlkZXIuc2V0RGVzY3JpcHRpb24oZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJcmV0dXJuIG5ldyBNUElDSDJTZXJ2aWNlUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyI2dldFJlc291cmNlTWFuYWdlcklkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTWFuYWdlcklkKCkgewotCQlyZXR1cm4gTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJGYWN0b3J5LlJNX0ZBQ1RPUllfSUQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNnZXRWZXJzaW9uSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKFRBR19WRVJTSU9OX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3ZpZGVyI3NldERlZmF1bHROYW1lQW5kRGVzYygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVBbmREZXNjKCkgewotCQlTdHJpbmcgbmFtZSA9IE1lc3NhZ2VzLk1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25fZGVmYXVsdE5hbWU7Ci0JCVN0cmluZyBjb25uID0gZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKGNvbm4gIT0gbnVsbCAmJiAhY29ubi5lcXVhbHMoRU1QVFlfU1RSSU5HKSkgewotCQkJbmFtZSArPSAiQCIgKyBjb25uOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0TmFtZShuYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbl9kZWZhdWx0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLklNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI3NldFZlcnNpb25JZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JZChTdHJpbmcgdmVyc2lvbklkKSB7Ci0JCXB1dFN0cmluZyhUQUdfVkVSU0lPTl9JRCwgdmVyc2lvbklkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJEaXNjb3ZlckpvYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyRGlzY292ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3YzQwOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJEaXNjb3ZlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5QVFBDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUE1hY2hpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLk1hY2hpbmVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0UmVtb3RlQ29tbWFuZEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyTm9kZUF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgR3JlZyBXYXRzb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJEaXNjb3ZlckpvYiBleHRlbmRzIEFic3RyYWN0UmVtb3RlQ29tbWFuZEpvYiB7Ci0JTVBJQ0gyUnVudGltZVN5c3RlbSBydHM7Ci0KLQlwdWJsaWMgTVBJQ0gyRGlzY292ZXJKb2IoTVBJQ0gyUnVudGltZVN5c3RlbSBydHMpIHsKLQkJc3VwZXIocnRzLAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX25hbWUsIHJ0cy5nZXRSbUNvbmZpZ3VyYXRpb24oKS5nZXROYW1lKCkpLAotCQkJCXJ0cy5yZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKS5nZXREaXNjb3ZlckNtZCgpLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX2ludGVycnVwdGVkRXJyb3JNZXNzYWdlLAotCQkJCU1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2UsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyRGlzY292ZXJKb2JfcGFyc2luZ0Vycm9yTWVzc2FnZSk7Ci0JCXRoaXMucnRzID0gcnRzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlKEJ1ZmZlcmVkUmVhZGVyIG91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBNUEkgcmVzb3VyY2UgbWFuYWdlciBoYXZlIG9ubHkgb25lIG1hY2hpbmUgYW5kIG9uZSBxdWV1ZS4KLQkJICogVGhlcmUgdGhleSBhcmUgaW1wbGljaXRseSAiZGlzY292ZXJlZCIuCi0JCSAqLwotCQlJUmVzb3VyY2VNYW5hZ2VyIHJtID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRzLmdldFJtSUQoKSk7Ci0JCVN0cmluZyBtYWNoaW5lSUQgPSBydHMuY3JlYXRlTWFjaGluZShybS5nZXROYW1lKCkpOwotCQlydHMuc2V0TWFjaGluZUlEKG1hY2hpbmVJRCk7Ci0JCVN0cmluZyBxdWV1ZUlEID0gcnRzLmNyZWF0ZVF1ZXVlKE1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX2RlZmF1bHRRdWV1ZU5hbWUpOwotCQlydHMuc2V0UXVldWVJRChxdWV1ZUlEKTsKLQotCQlJUE1hY2hpbmUgbWFjaGluZSA9IHJtLmdldE1hY2hpbmVCeUlkKG1hY2hpbmVJRCk7Ci0JCWFzc2VydCBtYWNoaW5lICE9IG51bGw7Ci0KLQkJLyoKLQkJICogQW55IGV4Y2VwdGlvbiBmcm9tIG5vdyBvbiBpcyBjYXVnaHQgaW4gb3JkZXIgdG8gYWRkIHRoZSBlcnJvciBtZXNzYWdlIGFzIGFuIGF0dHJpYnV0ZSB0byB0aGUgbWFjaGluZS4KLQkJICogVGhlbiwgdGhlIGV4Y2VwdGlvbiBpcyByZS10aHJvd24uCi0JCSAqLwotCQl0cnkgewotCQkJLyoKLQkJCSAqIFBhcnNlIG91dHB1dCBvZiB0cmFjZSBjb21tYW5kIHRoYXQgZGVzY3JpYmVzIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4KLQkJCSAqLwotCQkJTVBJQ0gyVHJhY2VQYXJzZXIgcGFyc2VyID0gbmV3IE1QSUNIMlRyYWNlUGFyc2VyKCk7Ci0JCQlNUElDSDJIb3N0TWFwIGhvc3RNYXAgPSBwYXJzZXIucGFyc2Uob3V0cHV0KTsKLQkJCWlmIChob3N0TWFwID09IG51bGwpIHsKLQkJCQltYWNoaW5lLmFkZEF0dHJpYnV0ZShNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0ZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTWFjaGluZUF0dHJpYnV0ZXMuU3RhdGUuRVJST1IpKTsKLQkJCQltYWNoaW5lLmFkZEF0dHJpYnV0ZShNUElDSDJNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fSG9zdEZpbGVQYXJzZUVycm9yKSk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNUElDSDJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBwYXJzZXIuZ2V0RXJyb3JNZXNzYWdlKCkpKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIENyZWF0ZSBtb2RlbCBhY2NvcmRpbmcgdG8gZGF0YSBmcm9tIGRpc2NvdmVyLgotCQkJICovCi0JCQlpbnQgbm9kZUNvdW50ZXIgPSAwOwotCi0JCQlmb3IgKE1QSUNIMkhvc3RNYXAuSG9zdCBob3N0IDogaG9zdE1hcC5nZXRIb3N0cygpKSB7Ci0KLQkJCQkvLyBBZGQgbm9kZSB0byBtb2RlbAotCQkJCVN0cmluZyBub2RlSWQgPSBydHMuY3JlYXRlTm9kZShtYWNoaW5lSUQsIGhvc3QuZ2V0TmFtZSgpLCBub2RlQ291bnRlcisrKTsKLQotCQkJCS8vIEFkZCBwcm9jZXNzb3IgaW5mb3JtYXRpb24gdG8gbm9kZS4KLQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCQlpZiAoaG9zdC5nZXROdW1Qcm9jZXNzb3JzKCkgIT0gMCkgewotCQkJCQl0cnkgewotCQkJCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1QSUNIMk5vZGVBdHRyaWJ1dGVzLmdldE51bWJlck9mTm9kZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGhvc3QuZ2V0TnVtUHJvY2Vzc29ycygpKSk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUaGlzIHNpdHVhdGlvbiBpcyBub3QgcG9zc2libGUgc2luY2UgaG9zdC5nZXROdW1Qcm9jZXNzb3JzKCkgaXMgYWx3YXlzIHZhbGlkLgotCQkJCQkJYXNzZXJ0IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJ0cy5jaGFuZ2VOb2RlKG5vZGVJZCwgYXR0ck1hbmFnZXIpOwotCQkJCXJ0cy5zZXROb2RlSURGb3JOYW1lKGhvc3QuZ2V0TmFtZSgpLCBub2RlSWQpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8qCi0JCQkgKiBTaG93IG1lc3NhZ2Ugb2YgY29yZSBleGNlcHRpb24gYW5kIGNoYW5nZSBtYWNoaW5lIHN0YXR1cyB0byBlcnJvci4KLQkJCSAqLwotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNYWNoaW5lQXR0cmlidXRlcy5TdGF0ZS5FUlJPUikpOwotCQkJCWF0dHJNYW5hZ2VyLmFkZEF0dHJpYnV0ZShNUElDSDJNYWNoaW5lQXR0cmlidXRlcy5nZXRTdGF0dXNNZXNzYWdlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShOTFMuYmluZChNZXNzYWdlcy5NUElDSDJEaXNjb3ZlckpvYl9FeGNlcHRpb25fRGlzY292ZXJDb21tYW5kRmFpbGVkLCBlLmdldE1lc3NhZ2UoKSkpKTsKLQkJCQlydHMuY2hhbmdlTWFjaGluZShtYWNoaW5lSUQsIGF0dHJNYW5hZ2VyKTsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvKgotCQkJICogU2hvdyBtZXNzYWdlIG9mIGFsbCBvdGhlciBleGNlcHRpb25zIGFuZCBjaGFuZ2UgbWFjaGluZSBzdGF0dXMgdG8gZXJyb3IuCi0JCQkgKi8KLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0ck1hbmFnZXIgPSBuZXcgQXR0cmlidXRlTWFuYWdlcigpOwotCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXRlQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShNYWNoaW5lQXR0cmlidXRlcy5TdGF0ZS5FUlJPUikpOwotCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkRpc2NvdmVySm9iX0V4Y2VwdGlvbl9EaXNjb3ZlckNvbW1hbmRJbnRlcm5hbEVycm9yLCBlLmdldE1lc3NhZ2UoKSkpKTsKLQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmVJRCwgYXR0ck1hbmFnZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gySG9zdE1hcC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gySG9zdE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRkNjRjLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkhvc3RNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gySG9zdE1hcCB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBIb3N0IHsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fRVJST1JTID0gMDsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJSX05VTV9TTE9UUyA9IDEgPDwgMTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJSX01BWF9OVU1fU0xPVFMgPSAxIDw8IDI7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUl9VTktOT1dOX0FUVFIgPSAxIDw8IDM7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGFkZHIgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBwb3J0ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgbnVtUHJvY2Vzc29ycyA9IDA7Ci0JCXByaXZhdGUgaW50IG1heE51bVByb2Nlc3NvcnMgPSAwOwotCQlwcml2YXRlIGludCBlcnJvcnMgPSBOT19FUlJPUlM7Ci0KLQkJcHVibGljIEhvc3QoU3RyaW5nIGhvc3RuYW1lLCBTdHJpbmcgYWRkcmVzcywgU3RyaW5nIHBvcnQpIHsKLQkJCXRoaXMubmFtZSA9IGhvc3RuYW1lOwotCQkJdGhpcy5hZGRyID0gYWRkcmVzczsKLQkJCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE51bVByb2Nlc3NvcnMoKSB7Ci0JCQlyZXR1cm4gbnVtUHJvY2Vzc29yczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWF4TnVtUHJvY2Vzc29ycygpIHsKLQkJCXJldHVybiBtYXhOdW1Qcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKLQkJCXJldHVybiBhZGRyOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQb3J0KCkgewotCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEVycm9ycygpIHsKLQkJCXJldHVybiBlcnJvcnM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROdW1Qcm9jZXNzb3JzKGludCBudW1Qcm9jZXNzb3JzKSB7Ci0JCQl0aGlzLm51bVByb2Nlc3NvcnMgPSBudW1Qcm9jZXNzb3JzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TWF4TnVtUHJvY2Vzc29ycyhpbnQgbWF4TnVtUHJvY2Vzc29ycykgewotCQkJdGhpcy5tYXhOdW1Qcm9jZXNzb3JzID0gbWF4TnVtUHJvY2Vzc29yczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9ycyhpbnQgZXJyb3JzKSB7Ci0JCQl0aGlzLmVycm9ycyB8PSBlcnJvcnM7Ci0JCX0KLQl9Ci0KLQlMaXN0PEhvc3Q+IGhvc3RzID0gbmV3IEFycmF5TGlzdDxIb3N0PigpOwotCU1hcDxTdHJpbmcsIEhvc3Q+IGhvc3ROYW1lVG9Ib3N0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBIb3N0PigpOwotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSG9zdChIb3N0IGhvc3QpIHsKLQkJaG9zdHMuYWRkKGhvc3QpOwotCQlob3N0TmFtZVRvSG9zdC5wdXQoaG9zdC5nZXROYW1lKCksIGhvc3QpOwotCX0KLQotCXB1YmxpYyBIb3N0W10gZ2V0SG9zdHMoKSB7Ci0JCXJldHVybiBob3N0cy50b0FycmF5KG5ldyBIb3N0W2hvc3RzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxIb3N0PiBnZXRIb3N0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBob3N0cy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSG9zdCBnZXRIb3N0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBob3N0TmFtZVRvSG9zdC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSG9zdChTdHJpbmcgbmFtZSwgU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBwb3J0KSB7Ci0JCU1QSUNIMkhvc3RNYXAuSG9zdCBob3N0ID0gbmV3IE1QSUNIMkhvc3RNYXAuSG9zdChuYW1lLCBhZGRyZXNzLCBwb3J0KTsKLQkJYWRkSG9zdChob3N0KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KCkgewotCQlyZXR1cm4gaG9zdHMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1BhcnNlRXJyb3JzKCkgewotCQlyZXR1cm4gaGFzRXJyb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkpvYk1hcC5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gySm9iTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MmZkNzYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gySm9iTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkpvYk1hcCB7Ci0KLQkvKioKLQkgKiBBbiBNUElDSDIgam9iLgotCSAqLwotCXB1YmxpYyBjbGFzcyBKb2IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk9CSUQgPSAxIDw8IDA7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0JBTElBUyA9IDEgPDwgMTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVTRVJOQU1FID0gMSA8PCAyOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSE9TVCA9IDEgPDwgMzsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJRCA9IDEgPDwgNDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJRCA9IDEgPDwgNTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBTksgPSAxIDw8IDY7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQR00gPSAxIDw8IDc7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBqb2JJRCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGpvYkFsaWFzID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBob3N0ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgcGlkID0gMDsKLQkJcHJpdmF0ZSBpbnQgc2lkID0gMDsKLQkJcHJpdmF0ZSBpbnQgcmFuayA9IDA7Ci0JCXByaXZhdGUgU3RyaW5nIHBnbSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IGNvbXBsZXRlOwotCi0JCXB1YmxpYyBKb2IoKSB7Ci0JCQl0aGlzLmNvbXBsZXRlID0gMDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGhvc3QKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLQkJCXJldHVybiBob3N0OwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgam9iSUQKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Sm9iSUQoKSB7Ci0JCQlyZXR1cm4gam9iSUQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSBqb2JBbGlhcwotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRKb2JBbGlhcygpIHsKLQkJCXJldHVybiBqb2JBbGlhczsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHBnbQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQZ20oKSB7Ci0JCQlyZXR1cm4gcGdtOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgcGlkCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFBpZCgpIHsKLQkJCXJldHVybiBwaWQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRoZSByYW5rCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCQlyZXR1cm4gcmFuazsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHNpZAotCQkgKi8KLQkJcHVibGljIGludCBnZXRTaWQoKSB7Ci0JCQlyZXR1cm4gc2lkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIHVzZXJuYW1lCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotCQkJcmV0dXJuIHVzZXJuYW1lOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHJldHVybiB0aGUgY29tcGxldGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gY29tcGxldGUgPT0gKEpPQklEIHwgSk9CQUxJQVMgfCBVU0VSTkFNRSB8IEhPU1QgfCBQSUQgfCBTSUQgfCBSQU5LIHwgUEdNKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBob3N0IHRoZSBob3N0IHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotCQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJCXRoaXMuY29tcGxldGUgfD0gSE9TVDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBqb2JJRCB0aGUgam9iSUQgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRKb2JJRChTdHJpbmcgam9iSUQpIHsKLQkJCXRoaXMuam9iSUQgPSBqb2JJRDsKLQkJCXRoaXMuY29tcGxldGUgfD0gSk9CSUQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gam9iQWxpYXMgdGhlIGpvYkFsaWFzIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Sm9iQWxpYXMoU3RyaW5nIGpvYkFsaWFzKSB7Ci0JCQl0aGlzLmpvYkFsaWFzID0gam9iQWxpYXM7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IEpPQkFMSUFTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwZ20gdGhlIHBnbSB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFBnbShTdHJpbmcgcGdtKSB7Ci0JCQl0aGlzLnBnbSA9IHBnbTsKLQkJCXRoaXMuY29tcGxldGUgfD0gUEdNOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIHBpZCB0aGUgcGlkIHRvIHNldAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UGlkKGludCBwaWQpIHsKLQkJCXRoaXMucGlkID0gcGlkOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBQSUQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gcmFuayB0aGUgcmFuayB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IHJhbmspIHsKLQkJCXRoaXMucmFuayA9IHJhbms7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IFJBTks7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gc2lkIHRoZSBzaWQgdG8gc2V0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTaWQoaW50IHNpZCkgewotCQkJdGhpcy5zaWQgPSBzaWQ7Ci0JCQl0aGlzLmNvbXBsZXRlIHw9IFNJRDsKLQkJfQotCQkvKioKLQkJICogQHBhcmFtIHVzZXJuYW1lIHRoZSB1c2VybmFtZSB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgewotCQkJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotCQkJdGhpcy5jb21wbGV0ZSB8PSBVU0VSTkFNRTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nIHN0ciA9ICJKb2IgIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFpc0NvbXBsZXRlKCkpIHsKLQkJCQlzdHIgKz0gIihpbmNvbXBsZXRlKSBbIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlzdHIgKz0gIl0iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgSk9CSUQpID09IEpPQklEKSB7Ci0JCQkJc3RyICs9ICIgaWQ6ICIgKyBqb2JJRDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIEpPQkFMSUFTKSA9PSBKT0JBTElBUykgewotCQkJCXN0ciArPSAiIGFsaWFzOiAiICsgam9iQWxpYXM7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBVU0VSTkFNRSkgPT0gVVNFUk5BTUUpIHsKLQkJCQlzdHIgKz0gIiB1c2VybmFtZToiICsgdXNlcm5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBIT1NUKSA9PSBIT1NUKSB7Ci0JCQkJc3RyICs9ICIgaG9zdDoiICsgaG9zdDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKChjb21wbGV0ZSAmIFBJRCkgPT0gUElEKSB7Ci0JCQkJc3RyICs9ICIgcGlkOiIgKyBwaWQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBTSUQpID09IFNJRCkgewotCQkJCXN0ciArPSAiIHNpZDoiICsgc2lkOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKGNvbXBsZXRlICYgUkFOSykgPT0gUkFOSykgewotCQkJCXN0ciArPSAiIHJhbms6IiArIHJhbms7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICgoY29tcGxldGUgJiBQR00pID09IFBHTSkgewotCQkJCXN0ciArPSAiIHBnbToiICsgcGdtOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gc3RyICsgIl0iOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxKb2I+PiBqb2JzQnlJRCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxKb2I+PigpOwotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycyA9IGZhbHNlOwotCi0JcHVibGljIE1QSUNIMkpvYk1hcCgpIHsKLQkJLy8gTm90aGluZy4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRKb2IoSm9iIGpvYikgewotCQlMaXN0PEpvYj4gam9icyA9IGpvYnNCeUlELmdldChqb2IuZ2V0Sm9iSUQoKSk7Ci0JCWlmIChqb2JzID09IG51bGwpIHsKLQkJCWpvYnMgPSBuZXcgQXJyYXlMaXN0PEpvYj4oKTsKLQkJCWpvYnNCeUlELnB1dChqb2IuZ2V0Sm9iSUQoKSwgam9icyk7CQkJCi0JCX0KLQkJam9icy5hZGQoam9iKTsKLQl9Ci0JCi0JcHVibGljIExpc3Q8Sm9iPiBnZXRKb2IoU3RyaW5nIGpvYklEKSB7Ci0JCXJldHVybiBqb2JzQnlJRC5nZXQoam9iSUQpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPExpc3Q8Sm9iPj4gZ2V0Sm9icygpIHsKLQkJcmV0dXJuIGpvYnNCeUlELnZhbHVlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkxpc3RKb2JzUGFyc2VyLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJMaXN0Sm9ic1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI1ZjkyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMkxpc3RKb2JzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMkxpc3RKb2JzUGFyc2VyIHsKLQlwdWJsaWMgZW51bSBKb2JMaXN0U3RhdGUge0pPQkxJU1RfSU5JVCwgSk9CTElTVF9TVEFSVCwgSk9CTElTVF9FTkQsIEpPQkxJU1RfQ09NUExFVEUsIEpPQkxJU1RfRVJST1J9Ci0JCi0JcHJpdmF0ZSBKb2JMaXN0U3RhdGUgc3RhdGU7Ci0JcHJpdmF0ZSBNUElDSDJKb2JNYXAgbWFwID0gbmV3IE1QSUNIMkpvYk1hcCgpOwotCXByaXZhdGUgU3RyaW5nIGVycm9yTXNnOwotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKiBAcGFyYW0gbGluZQotCSAqIEBwYXJhbSBqb2IKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0pvYkluZm8oU3RyaW5nIGxpbmUsIE1QSUNIMkpvYk1hcC5Kb2Igam9iKSB7Ci0JCVN0cmluZ1tdIHBhcnRzID0gbGluZS5zcGxpdCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBrZXk7Ci0JCVN0cmluZyB2YWx1ZTsKLQotCQlpZiAocGFydHMubGVuZ3RoID09IDEpIHsKLQkJCWtleSA9IHBhcnRzWzBdLnRyaW0oKTsKLQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT0gMikgewotCQkJa2V5ID0gcGFydHNbMF0udHJpbSgpOwotCQkJdmFsdWUgPSBwYXJ0c1sxXS50cmltKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0VSUk9SOwotCQkJZXJyb3JNc2cgPSBsaW5lOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoImpvYmlkIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0Sm9iSUQodmFsdWUpOwotCQl9IGVsc2UgaWYgKCJqb2JhbGlhcyIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldEpvYkFsaWFzKHZhbHVlKTsKLQkJfSBlbHNlIGlmICgidXNlcm5hbWUiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRVc2VybmFtZSh2YWx1ZSk7Ci0JCX0gZWxzZSBpZiAoImhvc3QiLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRIb3N0KHZhbHVlKTsKLQkJfSBlbHNlIGlmICgicGlkIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0UGlkKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLQkJfSBlbHNlIGlmICgic2lkIi5lcXVhbHMoa2V5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlqb2Iuc2V0U2lkKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLQkJfSBlbHNlIGlmICgicmFuayIuZXF1YWxzKGtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJam9iLnNldFJhbmsoSW50ZWdlci5wYXJzZUludCh2YWx1ZSkpOwotCQl9IGVsc2UgaWYgKCJwZ20iLmVxdWFscyhrZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWpvYi5zZXRQZ20odmFsdWUpOwotCQl9IGVsc2UgewotCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9FUlJPUjsKLQkJCWVycm9yTXNnID0gbGluZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGpvYi5pc0NvbXBsZXRlKCkpIHsKLQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfRU5EOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBNUElDSDJKb2JNYXAgcGFyc2UoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCU1QSUNIMkpvYk1hcC5Kb2Igam9iID0gbnVsbDsKLQotCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0lOSVQ7Ci0JCQotCQl3aGlsZSAoc3RhdGUgIT0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfQ09NUExFVEUpIHsKLQkJCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgSk9CTElTVF9JTklUOgotCQkJCWlmICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSA9PSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfQ09NUExFVEU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlsaW5lID0gbGluZS50cmltKCk7Ci0KLQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8vIElnbm9yZSBlbXB0eSBsaW5lCi0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfU1RBUlQ7Ci0KLQkJCQlqb2IgPSBtYXAubmV3IEpvYigpOwotCQkJCXByb2Nlc3NKb2JJbmZvKGxpbmUsIGpvYik7Ci0JCQkJYnJlYWs7Ci0JCQkKLQkJCWNhc2UgSk9CTElTVF9TVEFSVDoKLQkJCQlpZiAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgPT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJCWlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLQkJCQkJc3RhdGUgPSBKb2JMaXN0U3RhdGUuSk9CTElTVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQlwcm9jZXNzSm9iSW5mbyhsaW5lLCBqb2IpOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBKT0JMSVNUX0VORDoKLQkJCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCQkJaWYgKGpvYi5pc0NvbXBsZXRlKCkpIHsKLQkJCQkJCW1hcC5hZGRKb2Ioam9iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0RJU0NPVkVSX1RSQUNJTkcsICJqb2IgaXMgaW5jb21wbGV0ZSwgc2tpcHBpbmciICsgam9iLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGxpbmUgPT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IEpvYkxpc3RTdGF0ZS5KT0JMSVNUX0NPTVBMRVRFOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0YXRlID0gSm9iTGlzdFN0YXRlLkpPQkxJU1RfSU5JVDsKLQkJCQl9Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfRElTQ09WRVJfVFJBQ0lORywgImZvdW5kIGpvYiAiICsgam9iLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIEpPQkxJU1RfQ09NUExFVEU6Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIEpPQkxJU1RfRVJST1I6Ci0JCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkJZXJyb3JNc2cgKz0gIlxuIiArIGxpbmU7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBtYXA7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTXNnOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUGVyaW9kaWNKb2IuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlBlcmlvZGljSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzg4ODEuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUGVyaW9kaWNKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUHJvY2Vzc0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBNYWNoaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLk1hY2hpbmVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUuVG9vbHNSTVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFJlbW90ZUNvbW1hbmRKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJNYWNoaW5lQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLm1lc3NhZ2VzLk1lc3NhZ2VzOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlBlcmlvZGljSm9iIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVDb21tYW5kSm9iIHsKLQlNUElDSDJSdW50aW1lU3lzdGVtIHJ0czsKLQotCXB1YmxpYyBNUElDSDJQZXJpb2RpY0pvYihNUElDSDJSdW50aW1lU3lzdGVtIHJ0cykgewotCQlzdXBlcihydHMsCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9uYW1lLCBydHMuZ2V0Um1Db25maWd1cmF0aW9uKCkuZ2V0TmFtZSgpKSwKLQkJCQlydHMucmV0cmlldmVFZmZlY3RpdmVUb29sUm1Db25maWd1cmF0aW9uKCkuZ2V0UGVyaW9kaWNNb25pdG9yQ21kKCksCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9pbnRlcnJ1cHRlZEVycm9yTWVzc2FnZSwKLQkJCQlNZXNzYWdlcy5NUElDSDJNb25pdG9ySm9iX3Byb2Nlc3NFcnJvck1lc3NhZ2UsCi0JCQkJTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9wYXJzaW5nRXJyb3JNZXNzYWdlLAotCQkJCXJ0cy5yZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKS5nZXRQZXJpb2RpY01vbml0b3JUaW1lKCkpOwotCQl0aGlzLnJ0cyA9IHJ0czsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShCdWZmZXJlZFJlYWRlciBvdXRwdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogTVBJIHJlc291cmNlIG1hbmFnZXIgaGF2ZSBvbmx5IG9uZSBtYWNoaW5lIGFuZCBvbmUgcXVldWUuCi0JCSAqIFRoZXJlIHRoZXkgYXJlIGltcGxpY2l0bHkgImRpc2NvdmVyZWQiLgotCQkgKi8KLQkJSVJlc291cmNlTWFuYWdlciBybSA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFVuaXZlcnNlKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJ0cy5nZXRSbUlEKCkpOwotCQlJUE1hY2hpbmUgbWFjaGluZSA9IHJtLmdldE1hY2hpbmVCeUlkKHJ0cy5nZXRNYWNoaW5lSUQoKSk7Ci0JCUlQUXVldWUgcXVldWUgPSBybS5nZXRRdWV1ZUJ5SWQocnRzLmdldFF1ZXVlSUQoKSk7Ci0JCQotCQkvKgotCQkgKiBXZSBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbW9kZWwgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiBEbyBub3RoaW5nCi0JCSAqIGlmIHRoaXMgaXMgdGhlIGNhc2UuCi0JCSAqLwotCQlpZiAobWFjaGluZSA9PSBudWxsIHx8IHF1ZXVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qCi0JCSAqIEFueSBleGNlcHRpb24gZnJvbSBub3cgb24gaXMgY2F1Z2h0IGluIG9yZGVyIHRvIGFkZCB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hY2hpbmUuCi0JCSAqIFRoZW4sIHRoZSBleGNlcHRpb24gaXMgcmUtdGhyb3duLgotCQkgKi8KLQkJdHJ5IHsKLQkJCS8qCi0JCQkgKiBQYXJzZSBvdXRwdXQgb2YgbXBkbGlzdGpvYnMgY29tbWFuZC4KLQkJCSAqLwotCQkJTVBJQ0gyTGlzdEpvYnNQYXJzZXIgcGFyc2VyID0gbmV3IE1QSUNIMkxpc3RKb2JzUGFyc2VyKCk7Ci0JCQlNUElDSDJKb2JNYXAgam9iTWFwID0gcGFyc2VyLnBhcnNlKG91dHB1dCk7Ci0JCQlpZiAoam9iTWFwID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1QSUNIMlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIHBhcnNlci5nZXRFcnJvck1lc3NhZ2UoKSkpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogVXBkYXRlIG1vZGVsIGFjY29yZGluZyB0byBkYXRhLiBGaXJzdCBjcmVhdGUgYW55IG5ldyBqb2JzLgotCQkJICovCi0JCQlmb3IgKExpc3Q8TVBJQ0gySm9iTWFwLkpvYj4gam9icyA6IGpvYk1hcC5nZXRKb2JzKCkpIHsKLQkJCQlmb3IgKE1QSUNIMkpvYk1hcC5Kb2Igam9iIDogam9icykgewotCQkJCQlJUEpvYiBwSm9iID0gcXVldWUuZ2V0Sm9iQnlJZChqb2IuZ2V0Sm9iQWxpYXMoKSk7Ci0JCQkJCWlmIChwSm9iID09IG51bGwpIHsKLQkJCQkJCS8vIE5vdCBvbmUgb2Ygb3VyIGpvYnMKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUlQUHJvY2Vzc0NvbnRyb2wgcHJvY2VzcyA9IChJUFByb2Nlc3NDb250cm9sKXBKb2IuZ2V0UHJvY2Vzc0J5SW5kZXgoam9iLmdldFJhbmsoKSk7Ci0JCQkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCS8vIHByb2Nlc3MgYWxyZWFkeSBleGlzdHMsIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBub2RlSUQgPSBydHMuZ2V0Tm9kZUlEZm9yTmFtZShqb2IuZ2V0SG9zdCgpKTsKLQkJCQkJaWYgKG5vZGVJRCA9PSBudWxsKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvb2xzUk1QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBNZXNzYWdlcy5NUElDSDJSdW50aW1lU3lzdGVtSm9iX0V4Y2VwdGlvbl9Ib3N0bmFtZXNEb05vdE1hdGNoLCBudWxsKSk7Ci0JCQkJCX0KLQkKLQkJCQkJU3RyaW5nIHByb2Nlc3NJRCA9IHJ0cy5jcmVhdGVQcm9jZXNzKGpvYi5nZXRKb2JBbGlhcygpLCBqb2IuZ2V0UmFuaygpLCBub2RlSUQpOwotCQkJCQkKLQkJCQkJcHJvY2VzcyA9IChJUFByb2Nlc3NDb250cm9sKXBKb2IuZ2V0UHJvY2Vzc0J5SWQocHJvY2Vzc0lEKTsKLQkJCQkJcHJvY2Vzcy5zZXRTdGF0ZShQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5SVU5OSU5HKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLyoKLQkJCSAqIFNob3cgbWVzc2FnZSBvZiBjb3JlIGV4Y2VwdGlvbiBhbmQgY2hhbmdlIG1hY2hpbmUgc3RhdHVzIHRvIGVycm9yLgotCQkJICovCi0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNYW5hZ2VyID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQkJYXR0ck1hbmFnZXIuYWRkQXR0cmlidXRlKE1QSUNIMk1hY2hpbmVBdHRyaWJ1dGVzLmdldFN0YXR1c01lc3NhZ2VBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMk1vbml0b3JKb2JfRXhjZXB0aW9uX0NvbW1hbmRGYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSkpOwotCQkJCXJ0cy5jaGFuZ2VNYWNoaW5lKG1hY2hpbmUuZ2V0SUQoKSwgYXR0ck1hbmFnZXIpOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8qCi0JCQkgKiBTaG93IG1lc3NhZ2Ugb2YgYWxsIG90aGVyIGV4Y2VwdGlvbnMgYW5kIGNoYW5nZSBtYWNoaW5lIHN0YXR1cyB0byBlcnJvci4KLQkJCSAqLwotCQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVNYW5hZ2VyKCk7Ci0JCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKE1hY2hpbmVBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SKSk7Ci0JCQlhdHRyTWFuYWdlci5hZGRBdHRyaWJ1dGUoTVBJQ0gyTWFjaGluZUF0dHJpYnV0ZXMuZ2V0U3RhdHVzTWVzc2FnZUF0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTW9uaXRvckpvYl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvciwgZS5nZXRNZXNzYWdlKCkpKSk7Ci0JCQlydHMuY2hhbmdlTWFjaGluZShtYWNoaW5lLmdldElEKCksIGF0dHJNYW5hZ2VyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW0uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NTcyZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJSdW50aW1lU3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUucnRzeXN0ZW07Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucm1zeXN0ZW0uQWJzdHJhY3RFZmZlY3RpdmVUb29sUk1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLkVmZmVjdGl2ZU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5JTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gZXh0ZW5kcyBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHsKLQotCS8qKiBUaGUgbWFjaGluZSB3aGVyZSBvcGVuIG1waSBpcyBydW5uaW5nIG9uLiAqLwotCXByaXZhdGUgU3RyaW5nIG1hY2hpbmVJRDsKLQkvKiogVGhlIHF1ZXVlIHRoYXQgZGlzcGF0Y2hlcyBqb2JzIHRvIG1waS4gKi8KLQlwcml2YXRlIFN0cmluZyBxdWV1ZUlEOwotCS8qKiBNYXBwaW5nIG9mIGRpc2NvdmVyZWQgaG9zdHMgYW5kIHRoZWlyIElEIGZvciBJUE5vZGUgZWxlbWVudHMuICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLFN0cmluZz4gbm9kZU5hbWVUb0lETWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlwdWJsaWMgTVBJQ0gyUnVudGltZVN5c3RlbShJbnRlZ2VyIHJtaWQsCi0JCQlJTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlciBhdHRyRGVmTWdyKSB7Ci0JCXN1cGVyKHJtaWQsIGNvbmZpZywgYXR0ckRlZk1ncik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFjaGluZUlEKFN0cmluZyBtYWNoaW5lSUQpIHsKLQkJdGhpcy5tYWNoaW5lSUQgPSBtYWNoaW5lSUQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVldWVJRChTdHJpbmcgcXVldWVJRCkgewotCQl0aGlzLnF1ZXVlSUQgPSBxdWV1ZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFjaGluZUlEKCkgewotCQlyZXR1cm4gbWFjaGluZUlEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVldWVJRCgpIHsKLQkJcmV0dXJuIHF1ZXVlSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlSURmb3JOYW1lKFN0cmluZyBob3N0bmFtZSkgewotCQlyZXR1cm4gbm9kZU5hbWVUb0lETWFwLmdldChob3N0bmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZUlERm9yTmFtZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBub2RlSUQpIHsKLQkJbm9kZU5hbWVUb0lETWFwLnB1dChob3N0bmFtZSwgbm9kZUlEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9TaHV0ZG93bigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbSNkb1N0YXJ0RXZlbnRzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1N0YXJ0RXZlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtI2RvU3RhcnR1cChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1N0YXJ0dXAoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnJ0c3lzdGVtLkFic3RyYWN0VG9vbFJ1bnRpbWVTeXN0ZW0jZG9TdG9wRXZlbnRzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1N0b3BFdmVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9iIGNyZWF0ZURpc2NvdmVySm9iKCkgewotCQlpZiAoIXJtQ29uZmlndXJhdGlvbi5oYXNEaXNjb3ZlckNtZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKb2Igam9iID0gbmV3IE1QSUNIMkRpc2NvdmVySm9iKHRoaXMpOwotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJam9iLnNldFN5c3RlbShmYWxzZSk7Ci0JCWpvYi5zZXRVc2VyKGZhbHNlKTsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9iIGNyZWF0ZVBlcmlvZGljTW9uaXRvckpvYigpIHsKLQkJaWYgKCFybUNvbmZpZ3VyYXRpb24uaGFzUGVyaW9kaWNNb25pdG9yQ21kKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpvYiBqb2IgPSBuZXcgTVBJQ0gyUGVyaW9kaWNKb2IodGhpcyk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQlqb2Iuc2V0U3lzdGVtKGZhbHNlKTsKLQkJam9iLnNldFVzZXIoZmFsc2UpOwotCQlyZXR1cm4gam9iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2IgY3JlYXRlQ29udGludW91c01vbml0b3JKb2IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKb2IgY3JlYXRlUnVudGltZVN5c3RlbUpvYihTdHJpbmcgam9iSUQsIFN0cmluZyBxdWV1ZUlELCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IpIHsKLQkJcmV0dXJuIG5ldyBNUElDSDJSdW50aW1lU3lzdGVtSm9iKGpvYklELCBxdWV1ZUlELCBNZXNzYWdlcy5NUElDSDJSdW50aW1lU3lzdGVtX0pvYk5hbWUsIHRoaXMsIGF0dHJNZ3IpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0RWZmZWN0aXZlVG9vbFJNQ29uZmlndXJhdGlvbiByZXRyaWV2ZUVmZmVjdGl2ZVRvb2xSbUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRWZmZWN0aXZlTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihnZXRSbUNvbmZpZ3VyYXRpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUnVudGltZVN5c3RlbUpvYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyUnVudGltZVN5c3RlbUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGE3YzJiLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi9jb3JlL3J0c3lzdGVtL01QSUNIMlJ1bnRpbWVTeXN0ZW1Kb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ydHN5c3RlbTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Db25kaXRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuUFRQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSW50ZWdlckF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Kb2JBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuUHJvY2Vzc0F0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuYXR0cmlidXRlcy5Qcm9jZXNzQXR0cmlidXRlcy5TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklOZXdQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklQcm9jZXNzQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklSZW1vdmVQcm9jZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JUHJvY2Vzc0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJvY2Vzc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUucnRzeXN0ZW0uQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS5ydHN5c3RlbS5BYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLnV0aWxzLkRlYnVnVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uY29yZS51dGlscy5JbnB1dFN0cmVhbUxpc3RlbmVyVG9PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuSW5wdXRTdHJlYW1PYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLk1QSUNIMkpvYkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJMYXVuY2hBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUubWVzc2FnZXMuTWVzc2FnZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqIEBhdXRob3IgR3JlZyBXYXRzb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJSdW50aW1lU3lzdGVtSm9iIGV4dGVuZHMgQWJzdHJhY3RUb29sUnVudGltZVN5c3RlbUpvYiB7Ci0JCi0JcHVibGljIE9iamVjdCBsb2NrMSA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIElucHV0U3RyZWFtT2JzZXJ2ZXIgc3RkZXJyT2JzZXJ2ZXI7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbU9ic2VydmVyIHN0ZG91dE9ic2VydmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFJlZW50cmFudExvY2sgcHJvY3NMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKLQlwcm90ZWN0ZWQgZmluYWwgQ29uZGl0aW9uIHByb2NzQ29uZGl0aW9uID0gcHJvY3NMb2NrLm5ld0NvbmRpdGlvbigpOwotCXByb3RlY3RlZCBpbnQgbnVtUnVubmluZ1Byb2NzID0gMDsKLQotCXByb3RlY3RlZCBJUHJvY2Vzc0xpc3RlbmVyIHByb2Nlc3NMaXN0ZW5lciA9IG5ldyBJUHJvY2Vzc0xpc3RlbmVyKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklQcm9jZXNzTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuZXZlbnRzLklQcm9jZXNzQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJUHJvY2Vzc0NoYW5nZUV2ZW50IGUpIHsKLQkJCWlmIChlLmdldEF0dHJpYnV0ZXMoKS5nZXRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkpICE9IG51bGwKLQkJCQkJJiYgZS5nZXRTb3VyY2UoKS5nZXRTdGF0ZSgpID09IFByb2Nlc3NBdHRyaWJ1dGVzLlN0YXRlLlJVTk5JTkcpIHsKLQkJCQlwcm9jc0xvY2subG9jaygpOwotCQkJCXRyeSB7Ci0JCQkJCW51bVJ1bm5pbmdQcm9jcysrOwotCQkJCQlwcm9jc0NvbmRpdGlvbi5zaWduYWxBbGwoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwcm9jc0xvY2sudW5sb2NrKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcm90ZWN0ZWQgSUpvYkNoaWxkTGlzdGVuZXIgam9iQ2hpbGRMaXN0ZW5lciA9IG5ldyBJSm9iQ2hpbGRMaXN0ZW5lcigpIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSUNoYW5nZWRQcm9jZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJQ2hhbmdlZFByb2Nlc3NFdmVudCBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmxpc3RlbmVycy5JSm9iQ2hpbGRMaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5ldmVudHMuSU5ld1Byb2Nlc3NFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElOZXdQcm9jZXNzRXZlbnQgZSkgewotCQkJZm9yIChJUFByb2Nlc3MgcHJvY2VzcyA6IGUuZ2V0UHJvY2Vzc2VzKCkpIHsKLQkJCQlwcm9jZXNzLmFkZEVsZW1lbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMubGlzdGVuZXJzLklKb2JDaGlsZExpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmV2ZW50cy5JUmVtb3ZlUHJvY2Vzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSVJlbW92ZVByb2Nlc3NFdmVudCBlKSB7Ci0JCQlmb3IgKElQUHJvY2VzcyBwcm9jZXNzIDogZS5nZXRQcm9jZXNzZXMoKSkgewotCQkJCXByb2Nlc3MucmVtb3ZlRWxlbWVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXB1YmxpYyBNUElDSDJSdW50aW1lU3lzdGVtSm9iKFN0cmluZyBqb2JJRCwgU3RyaW5nIHF1ZXVlSUQsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFRvb2xSdW50aW1lU3lzdGVtIHJ0U3lzdGVtLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJNZ3IpIHsKLQkJc3VwZXIoam9iSUQsIHF1ZXVlSUQsIG5hbWUsIHJ0U3lzdGVtLCBhdHRyTWdyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hhbmdlQWxsUHJvY2Vzc2VzU3RhdHVzKFN0YXRlIG5ld1N0YXRlKSB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0KLQkJLyoKLQkJICogTWFyayBhbGwgcnVubmluZyBhbmQgc3RhcnRpbmcgcHJvY2Vzc2VzIGFzIGZpbmlzaGVkLgotCQkgKi8KLQkJTGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKElQUHJvY2VzcyBpcFByb2Nlc3MgOiBpcEpvYi5nZXRQcm9jZXNzZXMoKSkgewotCQkJc3dpdGNoIChpcFByb2Nlc3MuZ2V0U3RhdGUoKSkgewotCQkJY2FzZSBFWElURUQ6Ci0JCQljYXNlIEVSUk9SOgotCQkJY2FzZSBFWElURURfU0lHTkFMTEVEOgotCQkJCWJyZWFrOwotCQkJY2FzZSBSVU5OSU5HOgotCQkJY2FzZSBTVEFSVElORzoKLQkJCWNhc2UgU1VTUEVOREVEOgotCQkJY2FzZSBVTktOT1dOOgotCQkJCWlkcy5hZGQoaXBQcm9jZXNzLmdldElEKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQXR0cmlidXRlTWFuYWdlciBhdHRyTXJnID0gbmV3IEF0dHJpYnV0ZU1hbmFnZXIoKTsKLQkJYXR0ck1yZy5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RhdGVBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKG5ld1N0YXRlKSk7Ci0JCWZvciAoU3RyaW5nIHByb2Nlc3NJZCA6IGlkcykgewotCQkJcnRTeXN0ZW0uY2hhbmdlUHJvY2Vzcyhwcm9jZXNzSWQsIGF0dHJNcmcpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVFeGVjdXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUmVtb3RlUHJvY2Vzc0J1aWxkZXIgYnVpbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBNUElDSDJSdW50aW1lU3lzdGVtIHJ0U3lzdGVtID0gKE1QSUNIMlJ1bnRpbWVTeXN0ZW0pIGdldFJ0U3lzdGVtKCk7Ci0JCWZpbmFsIElQSm9iIGlwSm9iID0gUFRQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VW5pdmVyc2UoKS5nZXRSZXNvdXJjZU1hbmFnZXIocnRTeXN0ZW0uZ2V0Um1JRCgpKS5nZXRRdWV1ZUJ5SWQoZ2V0UXVldWVJRCgpKS5nZXRKb2JCeUlkKGdldEpvYklEKCkpOwotCQlpcEpvYi5hZGRDaGlsZExpc3RlbmVyKGpvYkNoaWxkTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0aW9uQ2xlYW5VcChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQlnZXRQcm9jZXNzKCkuZGVzdHJveSgpOwotCQl9Ci0JCWlmIChzdGRlcnJPYnNlcnZlciAhPSBudWxsKSB7Ci0JCQlzdGRlcnJPYnNlcnZlci5raWxsKCk7Ci0JCQlzdGRlcnJPYnNlcnZlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHN0ZG91dE9ic2VydmVyICE9IG51bGwpIHsKLQkJCXN0ZG91dE9ic2VydmVyLmtpbGwoKTsKLQkJCXN0ZG91dE9ic2VydmVyID0gbnVsbDsKLQkJfQotCQkvLyBUT0RPOiBtb3JlIGNsZWFudXA/Ci0JCWNoYW5nZUFsbFByb2Nlc3Nlc1N0YXR1cyhQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5FWElURUQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2JBdHRyaWJ1dGVzLlN0YXRlIGRvRXhlY3V0aW9uRmluaXNoZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNoYW5nZUFsbFByb2Nlc3Nlc1N0YXR1cyhQcm9jZXNzQXR0cmlidXRlcy5TdGF0ZS5FWElURUQpOwotCQlpZiAoZ2V0UHJvY2VzcygpLmV4aXRWYWx1ZSgpICE9IDApIHsKLQkJCWlmICghdGVybWluYXRlSm9iRmxhZykgewotCQkJCWNoYW5nZUpvYlN0YXR1c01lc3NhZ2UoTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyUnVudGltZVN5c3RlbUpvYl9FeGNlcHRpb25fRXhlY3V0aW9uRmFpbGVkV2l0aEV4aXRWYWx1ZSwgbmV3IEludGVnZXIoZ2V0UHJvY2VzcygpLmV4aXRWYWx1ZSgpKSkpOwotCQkJCXJldHVybiBKb2JBdHRyaWJ1dGVzLlN0YXRlLkVSUk9SOwotCQkJfQotCQkJCi0JCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lORywgIlJUUyBqb2IgI3swfTogaWdub3JpbmcgZXhpdCB2YWx1ZSB7MX0gYmVjYXVzZSBqb2Igd2FzIGZvcmNlZCB0byB0ZXJtaW5hdGUgYnkgdXNlciIsIGdldEpvYklEKCksIG5ldyBJbnRlZ2VyKGdldFByb2Nlc3MoKS5leGl0VmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuU3RhdGUuVEVSTUlOQVRFRDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGlvblN0YXJ0ZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1QSUNIMlJ1bnRpbWVTeXN0ZW0gcnRTeXN0ZW0gPSAoTVBJQ0gyUnVudGltZVN5c3RlbSkgZ2V0UnRTeXN0ZW0oKTsKLQkJZmluYWwgSVBKb2IgaXBKb2IgPSBQVFBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRVbml2ZXJzZSgpLmdldFJlc291cmNlTWFuYWdlcihydFN5c3RlbS5nZXRSbUlEKCkpLmdldFF1ZXVlQnlJZChnZXRRdWV1ZUlEKCkpLmdldEpvYkJ5SWQoZ2V0Sm9iSUQoKSk7Ci0KLQkJLyoKLQkJICogTGlzdGVuZXIgdGhhdCBzYXZlcyBzdGRvdXQuCi0JCSAqLwotCQlmaW5hbCBQaXBlZE91dHB1dFN0cmVhbSBzdGRvdXRPdXRwdXRTdHJlYW0gPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKLQkJZmluYWwgUGlwZWRJbnB1dFN0cmVhbSBzdGRvdXRJbnB1dFN0cmVhbSA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlzdGRvdXRJbnB1dFN0cmVhbS5jb25uZWN0KHN0ZG91dE91dHB1dFN0cmVhbSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydCBmYWxzZTsgLy8gVGhpcyBleGNlcHRpb24gaXMgbm90IHBvc3NpYmxlCi0JCX0KLQkJZmluYWwgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtIHN0ZG91dFBpcGVkU3RyZWFtTGlzdGVuZXIgPSBuZXcgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtKHN0ZG91dE91dHB1dFN0cmVhbSk7Ci0KLQkJVGhyZWFkIHN0ZG91dFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRvdXQgdGhyZWFkOiBzdGFydGVkIiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlCdWZmZXJlZFJlYWRlciBzdGRvdXRCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3Rkb3V0SW5wdXRTdHJlYW0pKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbGluZSA9IHN0ZG91dEJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlpbnQgcG9zID0gbGluZS5pbmRleE9mKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zID4gMCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluZGV4ID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygwLCBwb3MpKTsKLQkJCQkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2sxKSB7Ci0JCQkJCQkJSVBQcm9jZXNzIGlwUHJvYyA9IGlwSm9iLmdldFByb2Nlc3NCeUluZGV4KGluZGV4KTsKLQkJCQkJCQlpZiAoaXBQcm9jICE9IG51bGwpIHsKLQkJCQkJCQkJaXBQcm9jLmFkZEF0dHJpYnV0ZShQcm9jZXNzQXR0cmlidXRlcy5nZXRTdGRvdXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGxpbmUpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX09VVFBVVF9UUkFDSU5HLCAiUlRTIGpvYiAjezB9Oj4gezF9IiwgZ2V0Sm9iSUQoKSwgbGluZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWxpbmUgPSBzdGRvdXRCdWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRvdXQgdGhyZWFkOiB7MH0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNUElDSDJQbHVnaW4ubG9nKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0ZG91dFBpcGVkU3RyZWFtTGlzdGVuZXIuZGlzYWJsZSgpOwotCQkJCX0KLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiBzdGRvdXQgdGhyZWFkOiBmaW5pc2hlZCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQkJLyoKLQkJICogTGlzdGVuZXIgdGhhdCBzYXZlcyBzdGRlcnIuCi0JCSAqLwotCQlmaW5hbCBQaXBlZE91dHB1dFN0cmVhbSBzdGRlcnJPdXRwdXRTdHJlYW0gPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKLQkJZmluYWwgUGlwZWRJbnB1dFN0cmVhbSBzdGRlcnJJbnB1dFN0cmVhbSA9IG5ldyBQaXBlZElucHV0U3RyZWFtKCk7Ci0JCXRyeSB7Ci0JCQlzdGRlcnJJbnB1dFN0cmVhbS5jb25uZWN0KHN0ZGVyck91dHB1dFN0cmVhbSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydCBmYWxzZTsgLy8gVGhpcyBleGNlcHRpb24gaXMgbm90IHBvc3NpYmxlCi0JCX0KLQkJZmluYWwgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtIHN0ZGVyclBpcGVkU3RyZWFtTGlzdGVuZXIgPSBuZXcgSW5wdXRTdHJlYW1MaXN0ZW5lclRvT3V0cHV0U3RyZWFtKHN0ZGVyck91dHB1dFN0cmVhbSk7Ci0JCVRocmVhZCBzdGRlcnJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3RkZXJyIHRocmVhZDogc3RhcnRlZCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgc3RkZXJyQnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0ZGVycklucHV0U3RyZWFtKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGxpbmUgPSBzdGRlcnJCdWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCQkJCQl3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJaW50IHBvcyA9IGxpbmUuaW5kZXhPZigiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHBvcyA+IDApIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbmRleCA9IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMCwgcG9zKSk7Ci0JCQkJCQkJCWxpbmUgPSBsaW5lLnN1YnN0cmluZyhwb3MrMSk7Ci0JCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gaWdub3JlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJc3luY2hyb25pemVkIChsb2NrMSkgewotCQkJCQkJCUlQUHJvY2VzcyBpcFByb2MgPSBpcEpvYi5nZXRQcm9jZXNzQnlJbmRleChpbmRleCk7Ci0JCQkJCQkJaWYgKGlwUHJvYyAhPSBudWxsKSB7Ci0JCQkJCQkJCWlwUHJvYy5hZGRBdHRyaWJ1dGUoUHJvY2Vzc0F0dHJpYnV0ZXMuZ2V0U3RkZXJyQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShsaW5lKSk7Ci0JCQkJCQkJfQotCQkJCQkJCURlYnVnVXRpbC5lcnJvcihEZWJ1Z1V0aWwuUlRTX0pPQl9PVVRQVVRfVFJBQ0lORywgIlJUUyBqb2IgI3swfTo+IHsxfSIsIGdldEpvYklEKCksIGxpbmUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlsaW5lID0gc3RkZXJyQnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3RkZXJyIHRocmVhZDogezF9IiwgZ2V0Sm9iSUQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTVBJQ0gyUGx1Z2luLmxvZyhlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdGRlcnJQaXBlZFN0cmVhbUxpc3RlbmVyLmRpc2FibGUoKTsKLQkJCQl9Ci0JCQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogc3RkZXJyIHRocmVhZDogZmluaXNoZWQiLCBnZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHN0YXJ0aW5nIGFsbCB0aHJlYWRzIiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLyoKLQkJICogQ3JlYXRlIGFuZCBzdGFydCBsaXN0ZW5lcnMuCi0JCSAqLwotCQlzdGRvdXRUaHJlYWQuc3RhcnQoKTsKLQkJc3RkZXJyVGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3RkZXJyT2JzZXJ2ZXIgPSBuZXcgSW5wdXRTdHJlYW1PYnNlcnZlcihnZXRQcm9jZXNzKCkuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCXN0ZG91dE9ic2VydmVyID0gbmV3IElucHV0U3RyZWFtT2JzZXJ2ZXIoZ2V0UHJvY2VzcygpLmdldElucHV0U3RyZWFtKCkpOwotCi0JCXN0ZG91dE9ic2VydmVyLmFkZExpc3RlbmVyKHN0ZG91dFBpcGVkU3RyZWFtTGlzdGVuZXIpOwotCQlzdGRlcnJPYnNlcnZlci5hZGRMaXN0ZW5lcihzdGRlcnJQaXBlZFN0cmVhbUxpc3RlbmVyKTsKLQotCQlzdGRlcnJPYnNlcnZlci5zdGFydCgpOwotCQlzdGRvdXRPYnNlcnZlci5zdGFydCgpOwotCQkKLQkJLyoKLQkJICogQXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHBhdXNlIHVudGlsIGFsbCBwcm9jZXNzZXMgaGF2ZSBzdGFydGVkLiBUaGlzIGlzIGJlY2F1c2UKLQkJICogdGhlIG1vZGVsIHNlbWFudGljcyBhcmUgc3VjaCB0aGF0IHRoZSBqb2Igc3RhdGUgbXVzdCBub3QgYmUgc2V0IHRvIFJVTk5JTkcgdW50aWwKLQkJICogYWxsIHRoZSBqb2IncyBwcm9jZXNzZXMgKGlmIHRoZXJlIGFyZSBhbnkpIGhhdmUgYmVlbiBjcmVhdGVkIGFuZCBhbHNvIHNldCB0byBSVU5OSU5HLgotCQkgKi8KLQkJCi0JCS8qCi0JCSAqIFdlIGtub3cgdGhhdCBhIE1QSUNIMiBqb2IgaGFzIGEgbnVtYmVyIG9mIHByb2Nlc3NlcyBhdHRyaWJ1dGUKLQkJICovCi0JCWludCBudW1Qcm9jcyA9IDE7Ci0JCUludGVnZXJBdHRyaWJ1dGUgbnVtUHJvY3NBdHRyID0gZ2V0QXR0ck1ncigpLmdldEF0dHJpYnV0ZShKb2JBdHRyaWJ1dGVzLmdldE51bWJlck9mUHJvY2Vzc2VzQXR0cmlidXRlRGVmaW5pdGlvbigpKTsKLQkJaWYgKG51bVByb2NzQXR0ciAhPSBudWxsKSB7Ci0JCQludW1Qcm9jcyA9IG51bVByb2NzQXR0ci5nZXRWYWx1ZSgpLmludFZhbHVlKCk7Ci0JCX0KLQkJCi0JCXByb2NzTG9jay5sb2NrKCk7Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmIG51bVJ1bm5pbmdQcm9jcyA8IG51bVByb2NzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvY3NDb25kaXRpb24uYXdhaXQoNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJvY3NMb2NrLnVubG9jaygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9QcmVwYXJlRXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGU8PywgPywgPz5bXSBkb1JldHJpZXZlVG9vbEJhc2VTdWJzdGl0dXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIG1ha2UgbWFjcm9zIGF2YWlsYWJsZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB3b3JrIGRpcmVjdG9yeS4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGU8PywgPywgPz5bXSBkb1JldHJpZXZlVG9vbENvbW1hbmRTdWJzdGl0dXRpb25BdHRyaWJ1dGVzKAotCQkJQXR0cmlidXRlTWFuYWdlciBiYXNlU3Vic3RpdHV0aW9uQXR0cmlidXRlTWFuYWdlciwKLQkJCVN0cmluZyBkaXJlY3RvcnksIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52aXJvbm1lbnQpIHsKLQotCQlMaXN0PElBdHRyaWJ1dGU8PywgPywgPz4+IG5ld0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGU8Pyw/LD8+PigpOwotCi0JCS8qCi0JCSAqIEFuIE1QSUNIMiBzcGVjaWZpYyBhdHRyaWJ1dGUuCi0JCSAqIEF0dHJpYnV0ZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBuYW1lcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0JCSAqLwotCQlpbnQgcCA9IDA7Ci0JCVN0cmluZyBrZXlzW10gPSBuZXcgU3RyaW5nW2Vudmlyb25tZW50LnNpemUoKV07Ci0JCWZvciAoU3RyaW5nIGtleSA6IGVudmlyb25tZW50LmtleVNldCgpKSB7Ci0JCQlrZXlzW3ArK10gPSBrZXk7Ci0JCX0KLQkJbmV3QXR0cmlidXRlcy5hZGQoTVBJQ0gyTGF1bmNoQXR0cmlidXRlcy5nZXRFbnZpcm9ubWVudEtleXNBdHRyaWJ1dGVEZWZpbml0aW9uKCkuY3JlYXRlKGtleXMpKTsKLQotCQkvKgotCQkgKiBBbiBNUElDSDIgc3BlY2lmaWMgYXR0cmlidXRlLgotCQkgKiBBIHNob3J0Y3V0IHRoYXQgZ2VuZXJhdGVzIGFyZ3VtZW50cyBmb3IgdGhlIE1QSUNIMiBydW4gY29tbWFuZC4KLQkJICovCi0JCW5ld0F0dHJpYnV0ZXMuYWRkKE1QSUNIMkxhdW5jaEF0dHJpYnV0ZXMuZ2V0RW52aXJvbm1lbnRBcmdzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZSgpKTsKLQkJCi0JCS8qCi0JCSAqIFRoZSBqb2JpZCBpcyB1c2VkIHRvIGFsaWFzIHRoZSBNUElDSDIgam9iIHNvIHRoYXQgaXQgY2FuIGJlIG1hdGNoZWQgbGF0ZXIuCi0JCSAqLwotCQluZXdBdHRyaWJ1dGVzLmFkZChNUElDSDJKb2JBdHRyaWJ1dGVzLmdldEpvYklkQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShnZXRKb2JJRCgpKSk7Ci0JCQotCQlyZXR1cm4gbmV3QXR0cmlidXRlcy50b0FycmF5KG5ldyBJQXR0cmlidXRlPD8sID8sID8+W25ld0F0dHJpYnV0ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRvUmV0cmlldmVUb29sRW52aXJvbm1lbnQoKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm8gZXh0cmEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5lZWRzIHRvIGJlIHNldCBmb3IgTVBJQ0gyLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1Rlcm1pbmF0ZUpvYigpIHsKLQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9XYWl0RXhlY3V0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvKgotCQkgKiBXYWl0IHVudGlsIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgc3RvcCBiZWNhdXNlIHN0cmVhbSBhcmUgY2xvc2VkLgotCQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHByb2Nlc3MgaGFzIGZpbmlzaGVkLgotCQkgKi8KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogd2FpdGluZyBzdGRlcnIgdGhyZWFkIHRvIGZpbmlzaCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlzdGRlcnJPYnNlcnZlci5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCi0JCURlYnVnVXRpbC50cmFjZShEZWJ1Z1V0aWwuUlRTX0pPQl9UUkFDSU5HX01PUkUsICJSVFMgam9iICN7MH06IHdhaXRpbmcgc3Rkb3V0IHRocmVhZCB0byBmaW5pc2giLCBnZXRKb2JJRCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJc3Rkb3V0T2JzZXJ2ZXIuam9pbigpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQotCQkvKgotCQkgKiBTdGlsbCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHJlbW90ZSBwcm9jZXNzIG1pZ2h0IG5vdCBoYXZlIHlldCB0ZXJtaW5hdGVkLCBhbHRob3VnaCBzdGRvdXQgYW5kIHN0ZGVyciBpcyBjbG9zZWQuCi0JCSAqLwotCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19KT0JfVFJBQ0lOR19NT1JFLCAiUlRTIGpvYiAjezB9OiB3YWl0aW5nIG1waSBwcm9jZXNzIHRvIGZpbmlzaCBjb21wbGV0ZWx5IiwgZ2V0Sm9iSUQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWdldFByb2Nlc3MoKS53YWl0Rm9yKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElnbm9yZQotCQl9Ci0KLQkJRGVidWdVdGlsLnRyYWNlKERlYnVnVXRpbC5SVFNfSk9CX1RSQUNJTkdfTU9SRSwgIlJUUyBqb2IgI3swfTogY29tcGxldGVseSBmaW5pc2hlZCIsIGdldEpvYklEKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJUcmFjZVBhcnNlci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL2NvcmUvcnRzeXN0ZW0vTVBJQ0gyVHJhY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0MzNjMC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvY29yZS9ydHN5c3RlbS9NUElDSDJUcmFjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJ0c3lzdGVtOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLmNvcmUudXRpbHMuRGVidWdVdGlsOwotCi0vKioKLSAqIAotICogQGF1dGhvciBHcmVnIFdhdHNvbgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlRyYWNlUGFyc2VyIHsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgTVBJQ0gySG9zdE1hcCBtYXAgPSBuZXcgTVBJQ0gySG9zdE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFteX10rKV8oWzAtOV0pKyBcXCgoWzAtOS5dKylcXCkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgbXBkdHJhY2UgY29tbWFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogQHJldHVybiBhbiBNUElDSDJIb3N0TWFwIGNvbnRhaW5pbmcgdGhlIGtub3duIGhvc3RzLCBvciBudWxsIGlmIHRoZXJlIHdhcyBhbiBlcnJvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTVBJQ0gySG9zdE1hcCBwYXJzZShCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1QSUNIMlRyYWNlUGFyc2VyIHBhcnNlciA9IG5ldyBNUElDSDJUcmFjZVBhcnNlcigpOwotCQlTdHJpbmcgbGluZTsKLQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJaWYgKGxpbmUubGVuZ3RoKCk9PTApIHsKLQkJCQkvLyBJZ25vcmUgZW1wdHkgbGluZQotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7Ci0JCQlpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBQcm9iYWJseSBhbiBlcnJvciBmcm9tIG1wZHRyYWNlLiBDb2xsZWN0IGxpbmVzIGFuZCBtYXJrIGVycm9yLgotCQkJCSAqLwotCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkJZXJyb3JNZXNzYWdlICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAobWF0Y2hlci5tYXRjaGVzKCkgJiYgbWF0Y2hlci5ncm91cENvdW50KCkgPT0gMykgewotCQkJCVN0cmluZyBob3N0ID0gbWF0Y2hlci5ncm91cCgxKTsKLQkJCQlTdHJpbmcgcG9ydCA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0JCQkJU3RyaW5nIGFkZHIgPSBtYXRjaGVyLmdyb3VwKDMpOwotCQkJCXBhcnNlci5tYXAuYWRkSG9zdChob3N0LCBhZGRyLCBwb3J0KTsKLQkJCQlEZWJ1Z1V0aWwudHJhY2UoRGVidWdVdGlsLlJUU19ESVNDT1ZFUl9UUkFDSU5HLCAiZm91bmQgaG9zdCAiICsgaG9zdCArICIgYWRkciAiICsgYWRkciArICIgcG9ydCAiICsgcG9ydCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJzZXIubWFwOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS8uY2xhc3NwYXRoIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTNlNjguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnByb2plY3QgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjIxMjYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWUzNTQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNNb24gT2N0IDA2IDE0OjM2OjQ0IEdNVC0wMzowMCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOWJjZTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5wdHAuc2VydmljZXMuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC51aSwKLSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnJtLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUsCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWksCi0gb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoLAotIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHMKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTA5My4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhM2I5MS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL2RhdGEvbGF1bmNoLWRlZmF1bHRzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1YTMyYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU5VTVBST0NTPTEKLU5PTE9DQUw9ZmFsc2UKLVBSRUZJWD0KLVVTRVBSRUZJWD1mYWxzZQotSE9TVEZJTEU9Ci1VU0VIT1NURklMRT1mYWxzZQotSE9TVExJU1Q9Ci1VU0VIT1NUTElTVD1mYWxzZQotQVJHVU1FTlRTPQotVVNFREVGQVVMVEFSR1VNRU5UUz10cnVlCi1VU0VERUZBVUxUUEFSQU1FVEVSUz10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZiZjFmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1QVFAgTVBJQ0gyIChuZXcpIFVJCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3BsdWdpbi54bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0MTQ5Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC51aS5ybUNvbmZpZ3VyYXRpb25XaXphcmRzIj4KLSAgICAgIDxjb25maWd1cmF0aW9uV2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkud2l6YXJkcy5NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpY2gyLnVpLmNvbmZpZ3VyYXRpb25XaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucm1MYXVuY2hDb25maWd1cmF0aW9ucyI+Ci0gICAgICA8bGF1bmNoQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaC5NUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGljaDIudWkubGF1bmNoQ29uZmlndXJhdGlvbiIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLnByb3ZpZGVyQ29udHJpYnV0b3JzIj4KLSAgICAgIDxwcm92aWRlckNvbnRyaWJ1dG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuTVBJQ0gyUHJvdmlkZXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLk1QSUNIMlNlcnZpY2VQcm92aWRlciI+Ci0gICAgICA8L3Byb3ZpZGVyQ29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5wdHAudWkucm1Db25maWd1cmF0aW9uV2l6YXJkcyI+Ci0gICAgICA8Y29uZmlndXJhdGlvbldpemFyZAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHMuTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkuY29uZmlndXJhdGlvbldpemFyZCI+Ci0gICAgICA8L2NvbmZpZ3VyYXRpb25XaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9NUElDSDJQcm92aWRlckNvbnRyaWJ1dG9yLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlByb3ZpZGVyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2ZDlhYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL01QSUNIMlByb3ZpZGVyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbi4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS53aXphcmRzLk1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy5jb3JlLklTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5zZXJ2aWNlcy51aS5JU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLklSTUNvbmZpZ3VyYXRpb25XaXphcmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotDQotcHVibGljIGNsYXNzIE1QSUNIMlByb3ZpZGVyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJU2VydmljZVByb3ZpZGVyQ29udHJpYnV0b3IgDQotew0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNjb25maWd1cmVTZXJ2aWNlUHJvdmlkZXIob3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlciwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJ2aWNlUHJvdmlkZXIoSVNlcnZpY2VQcm92aWRlciBwcm92aWRlciwgU2hlbGwgcGFyZW50U2hlbGwpIA0KLQl7DQotCQkvLyBOb3QgaW1wbGVtZW50ZWQNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNnZXRXaXphcmQob3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlciwgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQ0KLQkgKi8NCi0JcHVibGljIElXaXphcmQgZ2V0V2l6YXJkKElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIsIElXaXphcmRQYWdlIHBhZ2UpIHsNCi0JCXJldHVybiBuZXcgUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkKHByb3ZpZGVyLCBwYWdlKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLnVpLklTZXJ2aWNlUHJvdmlkZXJDb250cmlidXRvciNnZXRXaXphcmRQYWdlcyhvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCwgb3JnLmVjbGlwc2UucHRwLnNlcnZpY2VzLmNvcmUuSVNlcnZpY2VQcm92aWRlcikNCi0JICovDQotCXB1YmxpYyBXaXphcmRQYWdlW10gZ2V0V2l6YXJkUGFnZXMoSVdpemFyZCB3aXphcmQsIElTZXJ2aWNlUHJvdmlkZXIgcHJvdmlkZXIpIA0KLQl7DQotCQlXaXphcmRQYWdlIHdpemFyZFBhZ2VzW107DQotCQkNCi0JCXdpemFyZFBhZ2VzID0gbmV3IFdpemFyZFBhZ2VbMV07DQotCQl3aXphcmRQYWdlc1swXSA9IG5ldyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKChJUk1Db25maWd1cmF0aW9uV2l6YXJkKXdpemFyZCk7DQotCQlyZXR1cm4gd2l6YXJkUGFnZXM7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9NUElDSDJVSVBsdWdpbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9NUElDSDJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmFhM2UxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvTVBJQ0gyVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5jb3JlLlRvb2xzUk1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoLk1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIE1QSUNIMlVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBNUElDSDJVSVBsdWdpbigpIHsKLQkJLy8gRW1wdHkgaW1wbGVtZW50YXRpb24uCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmxvYWREZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1QSUNIMlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmFpc2UgY29yZSBleGNlcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGNvcmVFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb29sc1JNUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIFJhaXNlIGNvcmUgZXhjZXB0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGNvcmVFcnJvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9vbHNSTVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIG1lc3NhZ2UsIHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbG9nIGVudHJ5IGZyb20gYW4gSVN0YXR1cwotCSAqCi0JICogQHBhcmFtIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhIHN0cmluZwotCSAqCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRVbmlxdWVJZGVudGlmaWVyKCksIElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBsb2cgZW50cnkgZnJvbSBhIFRocm93YWJsZQotCSAqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFVuaXF1ZUlkZW50aWZpZXIoKSwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuTVBJQ0gyVUlQbHVnaW5fRXhjZXB0aW9uX0ludGVybmFsRXJyb3IsIGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyCi0JICoKLQkgKiBAcmV0dXJuIHVuaXF1ZSBpZGVudGlmaWVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkZW50aWZpZXIoKSB7Ci0JCWlmIChnZXREZWZhdWx0KCkgPT0gbnVsbCkKLQkJCS8vIElmIHRoZSBkZWZhdWx0IGluc3RhbmNlIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsCi0JCQkvLyByZXR1cm4gYSBzdGF0aWMgaWRlbnRpZmllci4gVGhpcyBpZGVudGlmaWVyIG11c3QKLQkJCS8vIG1hdGNoIHRoZSBwbHVnaW4gaWQgZGVmaW5lZCBpbiBwbHVnaW4ueG1sCi0JCQlyZXR1cm4gUExVR0lOX0lEOwotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0FkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MGQ1ZDcuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklQUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLk1QSUNIMlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzCi1BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgewotCi0JQ29tcG9zaXRlIGNvbnRyb2w7Ci0JQnV0dG9uIHVzZUFyZ3NEZWZhdWx0c0J1dHRvbjsKLQlUZXh0IGFyZ3NUZXh0OwotCi0JY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiV2lkZ2V0TGlzdGVuZXIKLQlpbXBsZW1lbnRzIElDaGVja1N0YXRlTGlzdGVuZXIgewotCQlwdWJsaWMgV2lkZ2V0TGlzdGVuZXIoQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGR5bmFtaWNUYWIpIHsKLQkJCXN1cGVyKGR5bmFtaWNUYWIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCWNsYXNzIERhdGFTb3VyY2UgZXh0ZW5kcyBSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiRGF0YVNvdXJjZSB7Ci0JCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZBcmdzOwotCQlwcml2YXRlIFN0cmluZyBhcmdzOwotCi0JCXByb3RlY3RlZCBEYXRhU291cmNlKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCXVzZURlZkFyZ3MgPSB1c2VBcmdzRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlhcmdzID0gZXh0cmFjdFRleHQoYXJnc1RleHQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb0ZpZWxkcygpIHsKLQkJCWFwcGx5VGV4dChhcmdzVGV4dCwgYXJncyk7Ci0JCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZkFyZ3MpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb1N0b3JhZ2UoKSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoCi0JCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTLAotCQkJCQl1c2VEZWZBcmdzKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZSgKLQkJCQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywgYXJncyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZERlZmF1bHQoKSB7Ci0JCQlhcmdzID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfQVJHVU1FTlRTOwotCQkJdXNlRGVmQXJncyA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFM7Ci0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbVN0b3JhZ2UoKSB7Ci0JCQl0cnkgewotCQkJCWFyZ3MgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKAotCQkJCQkJTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0FSR1VNRU5UUywKLQkJCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUyk7Ci0JCQkJdXNlRGVmQXJncyA9IGdldENvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUywKLQkJCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBoYW5kbGUgZXhjZXB0aW9uPwotCQkJCU1QSUNIMlVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJaWYgKCF1c2VEZWZBcmdzICYmIGFyZ3MgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotCQkJCQkJTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlBcmd1bWVudHMpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnQgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbnRvIG9uZSBob3N0IHBlciBsaW5lCi0JCSAqIAotCQkgKiBAcGFyYW0gbGlzdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBob3N0TGlzdFRvVGV4dChTdHJpbmcgbGlzdCkgewotCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gdmFsdWVzID0gbGlzdC5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghdmFsdWVzW2ldLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCXJlc3VsdCArPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmVzdWx0ICs9IHZhbHVlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBuZXcgRGF0YVNvdXJjZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldExpc3RlbmVyKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUlQUXVldWUgcXVldWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWZpbmFsIEdyb3VwIGFyZ3VtZW50c0dyb3VwID0gbmV3IEdyb3VwKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJYXJndW1lbnRzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsCi0JCQkJZmFsc2UpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWFyZ3VtZW50c0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlhcmd1bWVudHNHcm91cAotCQkuc2V0VGV4dChNZXNzYWdlcy5BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTGF1bmNoQXJndW1lbnRzKTsKLQotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24gPSBuZXcgQnV0dG9uKGFyZ3VtZW50c0dyb3VwLCBTV1QuQ0hFQ0spOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24KLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRBcmd1bWVudHMpOwotCQkvLyB1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQl1c2VBcmdzRGVmYXVsdHNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVzZUFyZ3NEZWZhdWx0c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChhcmd1bWVudHNHcm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJbGFiZWwKLQkJLnNldFRleHQoTWVzc2FnZXMuQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0FyZ3VtZW50cyk7Ci0KLQkJYXJnc1RleHQgPSBuZXcgVGV4dChhcmd1bWVudHNHcm91cCwgU1dULkJPUkRFUik7Ci0JCWFyZ3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCX0KLQotCXB1YmxpYyBJQXR0cmlidXRlPD8sID8sID8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJSVBRdWV1ZSBxdWV1ZSwgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gc2V0RGVmYXVsdHMoCi0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIElSZXNvdXJjZU1hbmFnZXIgcm0sCi0JCQlJUFF1ZXVlIHF1ZXVlKSB7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKAotCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTLAotCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfQVJHVU1FTlRTLAotCQkJCU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0FSR1VNRU5UUyk7Ci0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsIG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlhcmdzVGV4dC5zZXRFbmFibGVkKCF1c2VBcmdzRGVmYXVsdHNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL0Jhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNzM5Y2IuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLmxhdW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbGxlZ2FsVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMuSm9iQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuUk1MYXVuY2hWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLmNvcmUuTVBJQ0gyTGF1bmNoQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLkFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkubGF1bmNoLlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS5sYXVuY2guUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzIEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7Ci0KLQlDb21wb3NpdGUgY29udHJvbDsKLQlTcGlubmVyIG51bVByb2NzU3Bpbm5lcjsKLQlCdXR0b24gbm9Mb2NhbEJ1dHRvbjsKLQlCdXR0b24gdXNlUHJlZml4QnV0dG9uOwotCVRleHQgcHJlZml4VGV4dDsKLQlUZXh0IGhvc3RGaWxlVGV4dDsKLQlCdXR0b24gaG9zdEZpbGVCdXR0b247Ci0JVGV4dCBob3N0TGlzdFRleHQ7Ci0JQnV0dG9uIGhvc3RMaXN0QnV0dG9uOwotCUJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQljbGFzcyBXaWRnZXRMaXN0ZW5lciBleHRlbmRzIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJXaWRnZXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyBXaWRnZXRMaXN0ZW5lcihBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZHluYW1pY1RhYikgewotCQkJc3VwZXIoZHluYW1pY1RhYik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9Nb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChlLmdldFNvdXJjZSgpID09IG51bVByb2NzU3Bpbm5lciB8fCBlLmdldFNvdXJjZSgpID09IHByZWZpeFRleHQgfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0RmlsZVRleHQgfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0TGlzdFRleHQpIHsKLQkJCQkvLwkJCQlnZXREYXRhU291cmNlKCkuanVzdFZhbGlkYXRlKCk7Ci0JCQl9IGVsc2V7Ci0JCQkJc3VwZXIuZG9Nb2RpZnlUZXh0KGUpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gbm9Mb2NhbEJ1dHRvbiB8fCBlLmdldFNvdXJjZSgpID09IHVzZVByZWZpeEJ1dHRvbikgewotCQkJCS8vCQkJCWdldERhdGFTb3VyY2UoKS5qdXN0VmFsaWRhdGUoKTsKLQkJCX0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSB1c2VQcmVmaXhCdXR0b24gfHwgZS5nZXRTb3VyY2UoKSA9PSBob3N0RmlsZUJ1dHRvbiB8fCBlLmdldFNvdXJjZSgpID09IGhvc3RMaXN0QnV0dG9uKSB7Ci0JCQkJLy8JCQkJZ2V0RGF0YVNvdXJjZSgpLmp1c3RWYWxpZGF0ZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYkRhdGFTb3VyY2UgewotCi0JCXByaXZhdGUgaW50IG51bVByb2NzOwotCQlwcml2YXRlIGJvb2xlYW4gbm9Mb2NhbDsKLQkJcHJpdmF0ZSBib29sZWFuIHVzZVByZWZpeDsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJlZml4OwotCQlwcml2YXRlIGJvb2xlYW4gdXNlSG9zdEZpbGU7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3RGaWxlOwotCQlwcml2YXRlIGJvb2xlYW4gdXNlSG9zdExpc3Q7Ci0JCXByaXZhdGUgU3RyaW5nIGhvc3RMaXN0OwotCi0JCXByb3RlY3RlZCBEYXRhU291cmNlKEFic3RyYWN0Uk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCW51bVByb2NzID0gbnVtUHJvY3NTcGlubmVyLmdldFNlbGVjdGlvbigpOwotCQkJbm9Mb2NhbCA9IG5vTG9jYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl1c2VQcmVmaXggPSB1c2VQcmVmaXhCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlwcmVmaXggPSBleHRyYWN0VGV4dChwcmVmaXhUZXh0KTsKLQkJCXVzZUhvc3RGaWxlID0gaG9zdEZpbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQlob3N0RmlsZSA9IGV4dHJhY3RUZXh0KGhvc3RGaWxlVGV4dCk7Ci0JCQl1c2VIb3N0TGlzdCA9IGhvc3RMaXN0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJaG9zdExpc3QgPSBleHRyYWN0VGV4dChob3N0TGlzdFRleHQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNvcHlUb0ZpZWxkcygpIHsKLQkJCW51bVByb2NzU3Bpbm5lci5zZXRTZWxlY3Rpb24obnVtUHJvY3MpOwotCQkJbm9Mb2NhbEJ1dHRvbi5zZXRTZWxlY3Rpb24obm9Mb2NhbCk7Ci0JCQl1c2VQcmVmaXhCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVByZWZpeCk7Ci0JCQlhcHBseVRleHQocHJlZml4VGV4dCwgcHJlZml4KTsKLQkJCWFwcGx5VGV4dChob3N0RmlsZVRleHQsIGhvc3RGaWxlKTsKLQkJCWhvc3RGaWxlQnV0dG9uLnNldFNlbGVjdGlvbih1c2VIb3N0RmlsZSk7Ci0JCQlhcHBseVRleHQoaG9zdExpc3RUZXh0LCBob3N0TGlzdFRvVGV4dChob3N0TGlzdCkpOwotCQkJaG9zdExpc3RCdXR0b24uc2V0U2VsZWN0aW9uKHVzZUhvc3RMaXN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG9TdG9yYWdlKCkgewotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OVU1QUk9DUywgbnVtUHJvY3MpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OT0xPQ0FMLCBub0xvY2FsKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSgpLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFUFJFRklYLCB1c2VQcmVmaXgpOwotCQkJZ2V0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5KCkuc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9QUkVGSVgsIHByZWZpeCk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RGSUxFLCB1c2VIb3N0RmlsZSk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RGSUxFLCBob3N0RmlsZSk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RMSVNULCB1c2VIb3N0TGlzdCk7Ci0JCQlnZXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoKS5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RMSVNULCBob3N0TGlzdCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZERlZmF1bHQoKSB7Ci0JCQludW1Qcm9jcyA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTOwotCQkJbm9Mb2NhbCA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05PTE9DQUw7Ci0JCQl1c2VQcmVmaXggPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VQUkVGSVg7Ci0JCQlwcmVmaXggPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QUkVGSVg7Ci0JCQlob3N0RmlsZSA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RGSUxFOwotCQkJdXNlSG9zdEZpbGUgPSBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NURklMRTsKLQkJCWhvc3RMaXN0ID0gTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVExJU1Q7Ci0JCQl1c2VIb3N0TGlzdCA9IE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RMSVNUOwotCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21TdG9yYWdlKCkgewotCQkJdHJ5IHsKLQkJCQludW1Qcm9jcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05VTVBST0NTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9OVU1QUk9DUyk7Ci0JCQkJbm9Mb2NhbCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX05PTE9DQUwsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05PTE9DQUwpOwotCQkJCXVzZVByZWZpeCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRVBSRUZJWCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFUFJFRklYKTsKLQkJCQlwcmVmaXggPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9QUkVGSVgsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BSRUZJWCk7Ci0JCQkJaG9zdEZpbGUgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9IT1NURklMRSwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVEZJTEUpOwotCQkJCXVzZUhvc3RGaWxlID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfVVNFSE9TVEZJTEUsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRUhPU1RGSUxFKTsKLQkJCQlob3N0TGlzdCA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX0hPU1RMSVNULCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NUTElTVCk7Ci0JCQkJdXNlSG9zdExpc3QgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NUTElTVCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVExJU1QpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBoYW5kbGUgZXhjZXB0aW9uPwotCQkJCU1QSUNIMlVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJaWYgKG51bVByb2NzIDwgMSkgewotCQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX05vUHJvY2Vzcyk7Ci0JCQl9Ci0JCQlpZiAodXNlUHJlZml4ICYmIHByZWZpeCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlQcmVmaXgpOwotCQkJfQotCQkJaWYgKHVzZUhvc3RGaWxlICYmIGhvc3RGaWxlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RmaWxlKTsKLQkJCX0KLQkJCWlmICh1c2VIb3N0TGlzdCAmJiBob3N0TGlzdCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlIb3N0TGlzdCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ29udmVydCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IGludG8gb25lIGhvc3QgcGVyIGxpbmUKLQkJICoKLQkJICogQHBhcmFtIGxpc3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgaG9zdExpc3RUb1RleHQoU3RyaW5nIGxpc3QpIHsKLQkJCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gdmFsdWVzID0gbGlzdC5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghdmFsdWVzW2ldLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCXJlc3VsdCArPSAiXHIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmVzdWx0ICs9IHZhbHVlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJEYXRhU291cmNlIGNyZWF0ZURhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiBuZXcgRGF0YVNvdXJjZSh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYldpZGdldExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpZGdldExpc3RlbmVyKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTnVtYmVyUHJvY2Vzc2VzKTsKLQotCQludW1Qcm9jc1NwaW5uZXIgPSBuZXcgU3Bpbm5lcihjb250cm9sLCBTV1QuQk9SREVSKTsKLQkJbnVtUHJvY3NTcGlubmVyLmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQludW1Qcm9jc1NwaW5uZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCi0JCWZpbmFsIEdyb3VwIG9wdGlvbnNHcm91cCA9IG5ldyBHcm91cChjb250cm9sLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDMsIDEpKTsKLQkJb3B0aW9uc0dyb3VwLnNldFRleHQoTWVzc2FnZXMuQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX09wdGlvbnNHcm91cCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJb3B0aW9uc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCW5vTG9jYWxCdXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJbm9Mb2NhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJbm9Mb2NhbEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob0xvY2FsKTsKLQotCQl1c2VQcmVmaXhCdXR0b24gPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJdXNlUHJlZml4QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQl1c2VQcmVmaXhCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfUHJlZml4KTsKLQotCQlwcmVmaXhUZXh0ID0gbmV3IFRleHQob3B0aW9uc0dyb3VwLCBTV1QuQk9SREVSKTsKLQkJcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJcHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQotCQlmaW5hbCBHcm91cCBob3N0R3JvdXAgPSBuZXcgR3JvdXAoY29udHJvbCwgU1dULk5PTkUpOwotCQlob3N0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCWhvc3RHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9Ib3N0R3JvdXApOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWhvc3RHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlob3N0RmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24oaG9zdEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlob3N0RmlsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQkJaG9zdEZpbGVCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfSG9zdEZpbGUpOwotCi0JCWhvc3RGaWxlVGV4dCA9IG5ldyBUZXh0KGhvc3RHcm91cCwgU1dULkJPUkRFUik7Ci0JCWhvc3RGaWxlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJaG9zdEZpbGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oaG9zdEdyb3VwLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0TGlzdGVuZXIoKSk7Ci0JCVBpeGVsQ29udmVydGVyIHBpeGVsY29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKGNvbnRyb2wpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWdkLndpZHRoSGludCA9IHBpeGVsY29udmVydGVyLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQnJvd3NlKTsKLQotCQlob3N0TGlzdEJ1dHRvbiA9IG5ldyBCdXR0b24oaG9zdEdyb3VwLCBTV1QuQ0hFQ0spOwotCQlob3N0TGlzdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWhvc3RMaXN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldExpc3RlbmVyKCkpOwotCQlob3N0TGlzdEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9Ib3N0TGlzdCk7Ci0KLQkJaG9zdExpc3RUZXh0ID0gbmV3IFRleHQoaG9zdEdyb3VwLCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwOwotCQlob3N0TGlzdFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWhvc3RMaXN0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwdWJsaWMgSUF0dHJpYnV0ZTw/LCA/LCA/PltdIGdldEF0dHJpYnV0ZXMoSVJlc291cmNlTWFuYWdlciBybSwKLQkJCUlQUXVldWUgcXVldWUsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUxpc3Q8SUF0dHJpYnV0ZTw/LD8sPz4+IGF0dHJzID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlPD8sPyw/Pj4oKTsKLQotCQlpbnQgbnVtUHJvY3MgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTlVNUFJPQ1MsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTKTsKLQkJdHJ5IHsKLQkJCWF0dHJzLmFkZChKb2JBdHRyaWJ1dGVzLmdldE51bWJlck9mUHJvY2Vzc2VzQXR0cmlidXRlRGVmaW5pdGlvbigpLmNyZWF0ZShudW1Qcm9jcykpOwotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNUElDSDJVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIE1lc3NhZ2VzLkJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9FeGNlcHRpb25fSW52YWxpZENvbmZpZ3VyYXRpb24sIGUpKTsKLQkJfQotCi0JCWF0dHJzLmFkZChNUElDSDJMYXVuY2hBdHRyaWJ1dGVzLmdldExhdW5jaEFyZ3VtZW50c0F0dHJpYnV0ZURlZmluaXRpb24oKS5jcmVhdGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5jYWxjdWxhdGVBcmd1bWVudHMoY29uZmlndXJhdGlvbikpKTsKLQotCQlyZXR1cm4gYXR0cnMudG9BcnJheShuZXcgSUF0dHJpYnV0ZTw/LD8sPz5bYXR0cnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9OVU1QUk9DUywgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTlVNUFJPQ1MpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfTk9MT0NBTCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfTk9MT0NBTCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VQUkVGSVgsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRVBSRUZJWCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9QUkVGSVgsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BSRUZJWCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9VU0VIT1NURklMRSwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVEZJTEUpOwotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfSE9TVEZJTEUsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RGSUxFKTsKLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5BVFRSX1VTRUhPU1RMSVNULCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NUTElTVCk7Ci0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uQVRUUl9IT1NUTElTVCwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfSE9TVExJU1QpOwotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJcHJlZml4VGV4dC5zZXRFbmFibGVkKHVzZVByZWZpeEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGhvc3RGaWxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJaG9zdEZpbGVUZXh0LnNldEVuYWJsZWQoaG9zdEZpbGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlob3N0TGlzdFRleHQuc2V0RW5hYmxlZChob3N0TGlzdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGIzMjVkLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLk1QSUNIMlVJUGx1Z2luOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFID0gTVBJQ0gyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5sYXVuY2hBdHRyaWJ1dGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNUFJPQ1MgPSBBVFRSX0JBU0UgKyAiLm51bVByb2NzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTk9MT0NBTCA9IEFUVFJfQkFTRSArICIubm9Mb2NhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BSRUZJWCA9IEFUVFJfQkFTRSArICIucHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFUFJFRklYID0gQVRUUl9CQVNFICsgIi51c2VQcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IT1NURklMRSA9IEFUVFJfQkFTRSArICIuaG9zdEZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VIT1NURklMRSA9IEFUVFJfQkFTRSArICIudXNlSG9zdEZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IT1NUTElTVCA9IEFUVFJfQkFTRSArICIuaG9zdExpc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VIT1NUTElTVCA9IEFUVFJfQkFTRSArICIudXNlSG9zdExpc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUkdVTUVOVFMgPSBBVFRSX0JBU0UgKyAiLmFyZ3VtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VTRURFRkFVTFRBUkdVTUVOVFMgPSBBVFRSX0JBU0UgKyAiLnVzZURlZmF1bHRBcmd1bWVudHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQVJBTUVURVJTID0gQVRUUl9CQVNFICsgIi5wYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMgPSBBVFRSX0JBU0UgKyAiLnVzZURlZmF1bHRQYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIFN0cmluZyBjYWxjdWxhdGVBcmd1bWVudHMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VERUZBVUxUQVJHVU1FTlRTKSkgewotCQkJU3RyaW5nIGxhdW5jaEFyZ3MgPSAiLW5wICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNUFJPQ1MsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05VTVBST0NTKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX05PTE9DQUwsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX05PTE9DQUwpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ub2xvY2FsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfVVNFUFJFRklYLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VQUkVGSVgpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC0tcHJlZml4ICIgKyBmaXhTdHJpbmcoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9QUkVGSVgsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1BSRUZJWCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9VU0VIT1NURklMRSwgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLkFUVFJfVVNFSE9TVEZJTEUpKSB7Ci0JCQkJbGF1bmNoQXJncyArPSAiIC1ob3N0ZmlsZSAiICsgZml4U3RyaW5nKGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSE9TVEZJTEUsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX0hPU1RGSUxFKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX1VTRUhPU1RMSVNULCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9VU0VIT1NUTElTVCkpIHsKLQkJCQlsYXVuY2hBcmdzICs9ICIgLWhvc3QgIiArIGZpeFN0cmluZyhjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0hPU1RMSVNULCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9IT1NUTElTVCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICghIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMsIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0cy5BVFRSX1VTRURFRkFVTFRQQVJBTUVURVJTKSkgewotCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9QQVJBTUVURVJTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9QQVJBTUVURVJTKTsKLQkJCQlmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwYXJhbSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7Ci0JCQkJCWxhdW5jaEFyZ3MgKz0gIiAtbWNhICIgKyBwYXJhbS5nZXRLZXkoKSArICIgIiArIGZpeFN0cmluZyhwYXJhbS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGxhdW5jaEFyZ3M7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbGF1bmNoQXJncyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfQVJHVU1FTlRTLCBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuQVRUUl9BUkdVTUVOVFMpOwotCQkJcmV0dXJuIGxhdW5jaEFyZ3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHN0cmluZyBzdWl0YWJsZSBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudAotCSAqCi0JICogQHBhcmFtIHMKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGZpeFN0cmluZyhTdHJpbmcgcykgewotCQkvLyBUT0RPIGlzIHRoYXQgcmlnaHQgYW5kIGVzY2FwZWQgY29ycmVjdGx5PwotCQlpZiAocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIlwiXCIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICJcIiIgKyBzICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjMTJiZS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5NUElDSDJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5NZXNzYWdlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIERhbmllbCBGZWxpeCBGZXJiZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHMgewotCXB1YmxpYyBzdGF0aWMgaW50IEFUVFJfTlVNUFJPQ1M7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIEFUVFJfTk9MT0NBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9VU0VQUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUl9IT1NURklMRTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9VU0VIT1NURklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSX0hPU1RMSVNUOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRUhPU1RMSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJfQVJHVU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBBVFRSX1VTRURFRkFVTFRBUkdVTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBBVFRSX1BBUkFNRVRFUlMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQVRUUl9VU0VERUZBVUxUUEFSQU1FVEVSUzsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0c1Jlc291cmNlUGF0aCA9ICIvZGF0YS9sYXVuY2gtZGVmYXVsdHMucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkRGVmYXVsdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBhdGggZGVmYXVsdHNQcm9wZXJ0aWVzUGF0aCA9IG5ldyBQYXRoKGRlZmF1bHRzUmVzb3VyY2VQYXRoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IE1QSUNIMlVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gcmVhZChkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBidW5kbGUpOwotCi0JCUFUVFJfTlVNUFJPQ1MgPSBnZXRJbnRlZ2VyKGJ1bmRsZSwgcHJvcGVydGllcywgIk5VTVBST0NTIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9OT0xPQ0FMID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJOT0xPQ0FMIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9QUkVGSVggPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiUFJFRklYIik7IC8vJE5PTi1OTFMtMSQKLQkJQVRUUl9VU0VQUkVGSVggPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRVBSRUZJWCIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfSE9TVEZJTEUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCAiSE9TVEZJTEUiKTsgLy8kTk9OLU5MUy0xJAotCQlBVFRSX1VTRUhPU1RGSUxFID0gZ2V0Qm9vbGVhbihidW5kbGUsIHByb3BlcnRpZXMsICJVU0VIT1NURklMRSIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfQVJHVU1FTlRTID0gZ2V0U3RyaW5nKGJ1bmRsZSwgcHJvcGVydGllcywgIkFSR1VNRU5UUyIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfVVNFREVGQVVMVEFSR1VNRU5UUyA9IGdldEJvb2xlYW4oYnVuZGxlLCBwcm9wZXJ0aWVzLCAiVVNFREVGQVVMVEFSR1VNRU5UUyIpOyAvLyROT04tTkxTLTEkCi0JCUFUVFJfVVNFREVGQVVMVFBBUkFNRVRFUlMgPSBnZXRCb29sZWFuKGJ1bmRsZSwgcHJvcGVydGllcywgIlVTRURFRkFVTFRQQVJBTUVURVJTIik7IC8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnQgQVRUUl9QUkVGSVggIT0gbnVsbDsKLQkJYXNzZXJ0IEFUVFJfSE9TVEZJTEUgIT0gbnVsbDsKLQkJYXNzZXJ0IEFUVFJfQVJHVU1FTlRTICE9IG51bGw7Ci0JCS8vIFRPRE86IHJlYWQgQVRUUl9QQVJBTUVURVJTCi0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIHJlYWQoUGF0aCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBCdW5kbGUgYnVuZGxlKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW07Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlpblN0cmVhbSA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oYnVuZGxlLCBkZWZhdWx0c1Byb3BlcnRpZXNQYXRoLCBmYWxzZSk7Ci0JCQlwcm9wZXJ0aWVzLmxvYWQoaW5TdHJlYW0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBNUElDSDJVSVBsdWdpbi5jb3JlRXJyb3JFeGNlcHRpb24oTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZSwgZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgTkxTLmJpbmQoTWVzc2FnZXMuTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX01pc3NpbmdWYWx1ZSwga2V5KSkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnRlZ2VyKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCBrZXkpOwotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIE5MUy5iaW5kKE1lc3NhZ2VzLk1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXIsIGtleSkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKEJ1bmRsZSBidW5kbGUsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoYnVuZGxlLCBwcm9wZXJ0aWVzLCBrZXkpOwotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiYWI2YS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL2xhdW5jaC9NUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLk1QSUNIMlJlc291cmNlTWFuYWdlcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkgewotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiIGRvQ3JlYXRlKElSZXNvdXJjZU1hbmFnZXIgcm0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBOZXdNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKHJtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXI+IGdldFJlc291cmNlTWFuYWdlckNsYXNzKCkgewotCQlyZXR1cm4gTVBJQ0gyUmVzb3VyY2VNYW5hZ2VyLmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTmV3TVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9sYXVuY2gvTmV3TVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE0YmRlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbGF1bmNoL05ld01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5sYXVuY2g7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLklSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLmxhdW5jaC5FeHRlbmRhYmxlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgZXh0ZW5kcyBFeHRlbmRhYmxlUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiB7Ci0KLQlwdWJsaWMgTmV3TVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihJUmVzb3VyY2VNYW5hZ2VyIHJtKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZER5bmFtaWNUYWIobmV3IEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYigpKTsKLQkJYWRkRHluYW1pY1RhYihuZXcgQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjOGE1NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS5tZXNzYWdlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJVSVBsdWdpbl9FeGNlcHRpb25fSW50ZXJuYWxFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQXJndW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0QXJndW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9EZWZhdWx0TUNBUGFyYW1ldGVyczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTGF1bmNoQXJndW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9NQ0FQYXJhbWV0ZXJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QQXJhbWV0ZXJUYWJsZV9Db2x1bW5fTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfUGFyYW1ldGVyVGFibGVfQ29sdW1uX1ZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUFyZ3VtZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eVBhcmFtZXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfRXhjZXB0aW9uX0ludmFsaWRDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ccm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0J5U2xvdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfSG9zdEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vTG9jYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vT3ZlcnN1YnNjcmliZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTnVtYmVyUHJvY2Vzc2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9QcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9Ib3N0R3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX0hvc3RMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZV9PcHRpb25zR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlIb3N0ZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX05vUHJvY2VzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJMYXVuY2hDb25maWd1cmF0aW9uRGVmYXVsdHNfRXhjZXB0aW9uX0ZhaWxlZFJlYWRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19GYWlsZWRQYXJzZUludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX01pc3NpbmdWYWx1ZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJQcmVmZXJlbmNlUGFnZV9UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WYWxpZGF0aW9uX05vVmVyc2lvblNlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmVyc2lvbkNvbWJvX1ZlcnNpb24xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGU7Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuCi0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODY3ZmZhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLU1QSUNIMlVJUGx1Z2luX0V4Y2VwdGlvbl9JbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yCi0KLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Bcmd1bWVudHM9QXJndW1lbnRzOgotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0RlZmF1bHRBcmd1bWVudHM9VXNlIGRlZmF1bHQgYXJndW1lbnRzCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfRGVmYXVsdE1DQVBhcmFtZXRlcnM9VXNlIGRlZmF1bHQgcGFyYW1ldGVycwotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0xhdW5jaEFyZ3VtZW50cz1MYXVuY2ggYXJndW1lbnRzCi1BZHZhbmNlZE1QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfTUNBUGFyYW1ldGVycz1NQ0EgUGFyYW1ldGVycwotQWR2YW5jZWRNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1BBcmFtZXRlclRhYmxlX0NvbHVtbl9OYW1lPU5hbWUKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9QYXJhbWV0ZXJUYWJsZV9Db2x1bW5fVmFsdWU9VmFsdWUKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9UaXRsZT1BZHZhbmNlZCBNUElDSDIKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5QXJndW1lbnRzPUFyZ3VtZW50cyBjYW5ub3QgYmUgZW1wdHkKLUFkdmFuY2VkTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9WYWxpZGF0aW9uX0VtcHR5UGFyYW1ldGVyPVBhcmFtZXRlciB2YWx1ZSBjYW5ub3QgYmUgZW1wdHkKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9FeGNlcHRpb25fSW52YWxpZENvbmZpZ3VyYXRpb249SW52YWxpZCBjb25maWd1cmF0aW9uCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfQnJvd3NlPUJyb3dzZQotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX0J5U2xvdD1CeSBzbG90Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfTGFiZWxfSG9zdEZpbGU9SG9zdCBmaWxlOgotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX05vTG9jYWw9Tm8gbG9jYWwKLUJhc2ljTVBJQ0gyUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl9MYWJlbF9Ob092ZXJzdWJzY3JpYmU9Tm8gb3ZlcnN1YnNjcmliZQotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX051bWJlclByb2Nlc3Nlcz1OdW1iZXIgb2YgcHJvY2Vzc2VzOgotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX0xhYmVsX1ByZWZpeD1QcmVmaXg6Ci1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGU9QmFzaWMgTVBJQ0gyCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdEdyb3VwPUhvc3RzCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVGl0bGVfSG9zdExpc3Q9SG9zdCBsaXN0OgotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1RpdGxlX09wdGlvbnNHcm91cD1PcHRpb25zCi1CYXNpY01QSUNIMlJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfVmFsaWRhdGlvbl9FbXB0eUhvc3RmaWxlPU11c3QgcHJvdmlkZSBhIGhvc3QgZmlsZQotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlIb3N0TGlzdD1NdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIGhvc3QgbmFtZQotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fRW1wdHlQcmVmaXg9UHJlZml4IGNhbm5vdCBiZSBlbXB0eQotQmFzaWNNUElDSDJSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiX1ZhbGlkYXRpb25fTm9Qcm9jZXNzPU11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcHJvY2VzcwotTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0V4Y2VwdGlvbl9GYWlsZWRSZWFkRmlsZT1GYWlsZWQgdG8gcmVhZCBwcm9wZXJ0aWVzIGZpbGUgd2l0aCBkZWZhdWx0IHByZWZlcmVuY2VzLgotTVBJQ0gyTGF1bmNoQ29uZmlndXJhdGlvbkRlZmF1bHRzX0ZhaWxlZFBhcnNlSW50ZWdlcj1GYWlsZWQgdG8gcGFyc2UgaW50ZWdlciBkZWZhdWx0IHZhbHVlIGZvciB7MH0KLU1QSUNIMkxhdW5jaENvbmZpZ3VyYXRpb25EZWZhdWx0c19NaXNzaW5nVmFsdWU9TWlzc2luZyBkZWZhdWx0IHZhbHVlIGZvciB7MH0KLQotTVBJQ0gyUHJlZmVyZW5jZVBhZ2VfVGl0bGU9TVBJQ0gyIHByZWZlcmVuY2VzCi0KLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uPUVudGVyIGluZm9ybWF0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgTVBJQ0gyIHRvb2wKLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0xhYmVsX1ZlcnNpb249TVBJQ0gyIHZlcnNpb246Ci1NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9OYW1lPU1QSUNIMgotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGU9TVBJQ0gyIHRvb2wgY29uZmlndXJhdGlvbgotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmFsaWRhdGlvbl9Ob1ZlcnNpb25TZWxlY3RlZD1ObyBNUElDSDIgdmVyc2lvbiBzZWxlY3RlZAotTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVmVyc2lvbkNvbWJvX1ZlcnNpb24xMj1NUElDSDIKLU1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1ZlcnNpb25Db21ib19WZXJzaW9uMTM9TVBJQ0gyCi1NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uPUVudGVyIE1QSUNIMiBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi1NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlPU1QSUNIMiBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvd2l6YXJkcy9NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YmY5YTIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5NUElDSDJQcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLklNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS51aS53aXphcmRzLkFic3RyYWN0Q29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnVpLndpemFyZHMuQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkcy5XaXphcmRQYWdlRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0udWkud2l6YXJkcy5XaXphcmRQYWdlV2lkZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLklSTUNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsKLQotCVN0cmluZyB2ZXJzaW9uSWRzW10gPSBuZXcgU3RyaW5nW10geyB9OwotCVN0cmluZyB2ZXJzaW9uc05hbWVzW10gPSBuZXcgU3RyaW5nW10geyBNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEyLCBNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9WZXJzaW9uQ29tYm9fVmVyc2lvbjEzfTsKLQotCXByb3RlY3RlZCBDb21ibyB2ZXJzaW9uQ29tYm87Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2lkZ2V0TGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdFRvb2xSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLldpZGdldExpc3RlbmVyIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvTW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsKLQkJCXN1cGVyLmRvTW9kaWZ5VGV4dChldnQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHZlcnNpb25Db21ibykgewotCQkJCWhhbmRsZVZlcnNpb25TZWxlY3RlZCgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQkJZ2V0RGF0YVNvdXJjZSgpLnN0b3JlQW5kVmFsaWRhdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEYXRhU291cmNlIGV4dGVuZHMgQWJzdHJhY3RUb29sUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5EYXRhU291cmNlIHsKLQkJcHJvdGVjdGVkIERhdGFTb3VyY2UoQWJzdHJhY3RDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCQlzdXBlcihwYWdlKTsKLQkJfQotCi0JCXByaXZhdGUgSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5RnJvbUZpZWxkcygpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCXN1cGVyLmNvcHlGcm9tRmllbGRzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weVRvRmllbGRzKCkgewotCQkJc3VwZXIuY29weVRvRmllbGRzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21TdG9yYWdlKCkgewotCQkJc3VwZXIubG9hZEZyb21TdG9yYWdlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY29weVRvU3RvcmFnZSgpIHsKLQkJCXN1cGVyLmNvcHlUb1N0b3JhZ2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxvY2FsKCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkJc3VwZXIudmFsaWRhdGVMb2NhbCgpOwotCQl9Ci0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0Q29uZmlnKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJCXRoaXMuY29uZmlnID0gKElNUElDSDJSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uOwotCQkJc3VwZXIuc2V0Q29uZmlnKGNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdpemFyZFBhZ2VXaWRnZXRMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaWRnZXRMaXN0ZW5lcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXaXphcmRQYWdlRGF0YVNvdXJjZSBjcmVhdGVEYXRhU291cmNlKCkgewotCQlyZXR1cm4gbmV3IERhdGFTb3VyY2UodGhpcyk7Ci0JfQotCi0JcHVibGljIE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKElSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7Ci0JCXN1cGVyKHdpemFyZCwgSU1QSUNIMlJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24uTVBJQ0gyX0NBUEFCSUxJVElFUywgCi0JCQkJTWVzc2FnZXMuTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfTmFtZSwgCi0JCQkJTWVzc2FnZXMuTVBJQ0gyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGUsIAotCQkJCU1lc3NhZ2VzLk1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX0Rlc2NyaXB0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGRvQ3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGVudHMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb250ZW50cy5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQljcmVhdGVDb250ZW50cyhjb250ZW50cyk7Ci0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnNpb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250ZW50cyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb250ZW50cy5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb250ZW50cy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvKgotCQkgKiBTZWxlY3Rpb24gZm9yIG9wZW5tcGkgdmVyc2lvbi4KLQkJICovCi0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5NUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9MYWJlbF9WZXJzaW9uKTsKLQotCQl2ZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8oY29udGVudHMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2ZXJzaW9uQ29tYm8uYWRkKHZlcnNpb25zTmFtZXNbaV0pOwotCQl9Ci0JCXZlcnNpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRXaWRnZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVWZXJzaW9uU2VsZWN0ZWQoKSB7Ci0JCWdldFdpZGdldExpc3RlbmVyKCkuZGlzYWJsZSgpOwotCQlEYXRhU291cmNlIGRhdGFTb3VyY2UgPSAoRGF0YVNvdXJjZSkgdGhpcy5nZXREYXRhU291cmNlKCk7Ci0JCWRhdGFTb3VyY2UuanVzdFZhbGlkYXRlKCk7Ci0JCVN0cmluZyBsYXVuY2hDbWQgPSBudWxsOwotCQlTdHJpbmcgZGVidWdDbWQgPSBudWxsOwotCQlTdHJpbmcgZGlzY292ZXJDbWQgPSBudWxsOwotCQlTdHJpbmcgcmVtb3RlSW5zdGFsbFBhdGggPSBudWxsOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IE1QSUNIMlByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7Ci0JCWxhdW5jaENtZCA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGSVggKyBNUElDSDJQcmVmZXJlbmNlTWFuYWdlci5QUkVGU19MQVVOQ0hfQ01EKTsKLQkJZGVidWdDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfREVCVUdfQ01EKTsKLQkJZGlzY292ZXJDbWQgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfRElTQ09WRVJfQ01EKTsKLQkJcmVtb3RlSW5zdGFsbFBhdGggPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRklYICsgTVBJQ0gyUHJlZmVyZW5jZU1hbmFnZXIuUFJFRlNfUkVNT1RFX0lOU1RBTExfUEFUSCk7Ci0JCXJlc2V0RXJyb3JNZXNzYWdlcygpOwotCQlkYXRhU291cmNlLnNldENvbW1hbmRGaWVsZHMobGF1bmNoQ21kLCBkZWJ1Z0NtZCwgZGlzY292ZXJDbWQsIG51bGwsIDAsIG51bGwsIGRhdGFTb3VyY2UuZ2V0UmVtb3RlSW5zdGFsbFBhdGgoKSk7Ci0JCWRhdGFTb3VyY2Uuc2V0VXNlRGVmYXVsdHModHJ1ZSk7Ci0JCWRhdGFTb3VyY2UuY29weVRvRmllbGRzKCk7Ci0JCWdldFdpZGdldExpc3RlbmVyKCkuZW5hYmxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvd2l6YXJkcy9NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg3YTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkubWVzc2FnZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS53aXphcmRzLkFic3RyYWN0UmVtb3RlUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuSVJNQ29uZmlndXJhdGlvbldpemFyZDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgRGFuaWVsIEZlbGl4IEZlcmJlcgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZShJUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLk1QSUNIMlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfVGl0bGUpOwotCQlzZXRUaXRsZShNZXNzYWdlcy5NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX1RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9EZXNjcmlwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvd2l6YXJkcy9NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTI1OTVmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL21waS9tcGljaDIvdWkvd2l6YXJkcy9NUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi5jb3JlLnJtc3lzdGVtLk1QSUNIMlJlc291cmNlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLklSTUNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBEYW5pZWwgRmVsaXggRmVyYmVyCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgZXh0ZW5kcyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSB7Ci0KLQlwdWJsaWMgTVBJQ0gyUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkoKSB7Ci0JCS8vIG5vLW9wCi0JfQotCi0JcHJvdGVjdGVkIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSBnZXRNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZXMoSVJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsKLQkJcmV0dXJuIG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW10gewotCQkJCW5ldyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSh3aXphcmQpCi0JCX07Ci0JfQotCi0JLy8JQE92ZXJyaWRlCi0JQE92ZXJyaWRlCi0JcHVibGljIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSBnZXRQYWdlcyhJUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlMaXN0PFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U+KCk7Ci0JCWxpc3QuYWRkKG5ldyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKHdpemFyZCkpOwotCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlcyh3aXphcmQpKSk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvLwlAT3ZlcnJpZGUKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5PiBnZXRSTUZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIE1QSUNIMlJlc291cmNlTWFuYWdlckZhY3RvcnkuY2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5tcGkubXBpY2gyLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vbXBpL21waWNoMi91aS93aXphcmRzL01QSUNIMlJNU2VydmljZVByb3ZpZGVyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwNGZlNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIudWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9tcGkvbXBpY2gyL3VpL3dpemFyZHMvTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0ubXBpLm1waWNoMi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLm1waS5tcGljaDIuY29yZS5ybXN5c3RlbS5NUElDSDJSTVNlcnZpY2VQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLklSTUNvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnVpLndpemFyZHMuUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSB1c2VkIHRvIGJyaWRnZSBiZXR3ZWVuIHRoZSBvbGQgUk0gZmFjdG9yeSB3aXphcmQgYW5kIHRoZSBuZXcgUk1zIGJhY2tlZAotICogYnkgc2VydmljZSBjb25maWd1cmF0aW9ucy4gSXQgd2lsbCBiZSByZW1vdmVkIHByaW9yIHRvIHRoZSAzLjAgcmVsZWFzZS4KLSAqIAotICogQGF1dGhvciBncmVnCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgZXh0ZW5kcyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSB7Ci0KLQlwdWJsaWMgTVBJQ0gyUk1TZXJ2aWNlUHJvdmlkZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkoKSB7Ci0JCS8vIG5vLW9wCi0JfQotCi0JcHJvdGVjdGVkIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSBnZXRNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZXMoSVJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsKLQkJcmV0dXJuIG5ldyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW10gewotCQkJCW5ldyBNUElDSDJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSh3aXphcmQpCi0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbXSBnZXRQYWdlcyhJUk1Db25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCkgewotCQlMaXN0PFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U+KCk7Ci0JCWxpc3QuYWRkKG5ldyBNUElDSDJSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKHdpemFyZCkpOwotCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1QSUNIMkNvbmZpZ3VyYXRpb25XaXphcmRQYWdlcyh3aXphcmQpKSk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElSZXNvdXJjZU1hbmFnZXJGYWN0b3J5PiBnZXRSTUZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIE1QSUNIMlJNU2VydmljZVByb3ZpZGVyRmFjdG9yeS5jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvLmNsYXNzcGF0aCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE1OTY3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2MWNjNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQyNjIwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUNCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZTtzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUuQWN0aXZhdG9yDQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2Uuc2VhcmNoLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnByb3h5LnByb3RvY29sLA0KLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjEuMCINCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0NCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL2Fib3V0Lmh0bWwgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNmYzYS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPg0KLSANCi08cD5BcHJpIDE0LCAyMDA5PC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjAzNzUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbA0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2ZDdkMC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9UFRQIFNMVVJNIENvcmUKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvcGx1Z2luLnhtbCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ3OWUzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+DQotPHBsdWdpbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5jb3JlLnJlc291cmNlTWFuYWdlcnMiPg0KLSAgICAgIDxyZXNvdXJjZU1hbmFnZXINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uU0xVUk1SZXNvdXJjZU1hbmFnZXJGYWN0b3J5Ig0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wdHAuc2x1cm0uY29yZS5yZXNvdXJjZW1hbmFnZXIiDQotICAgICAgICAgICAgbmFtZT0iU0xVUk0iLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL0FjdGl2YXRvci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmZmYyMy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZSI7DQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsNCi0JDQotCS8qKg0KLQkgKiBUaGUgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBY3RpdmF0b3IoKSB7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvU0xVUk1BdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFjOTAyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvU0xVUk1BdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmU7DQotDQotcHVibGljIGNsYXNzIFNMVVJNQXR0cmlidXRlcyB7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvU0xVUk1Kb2JBdHRyaWJ1dGVzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNSm9iQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUzMDZlLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvU0xVUk1Kb2JBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuSUF0dHJpYnV0ZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5tZXNzYWdlcy5NZXNzYWdlczsKLQotCi0vKioKLSAqIEpvYiBhdHRyaWJ1dGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBTTFVSTUpvYkF0dHJpYnV0ZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1fTk9ERVNfQVRUUl9JRCA9ICJudW1iZXJPZk5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FX0xJTUlUX0FUVFJfSUQgPSAidGltZUxpbWl0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtTm9kZXNBdHRyRGVmID0gCi0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihOVU1fTk9ERVNfQVRUUl9JRCwgIk5vZGVzIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlcy5TTFVSTUpvYkF0dHJpYnV0ZXNfMCwgdHJ1ZSwgMSk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiB0aW1lTGltaXRBdHRyRGVmID0gCi0JCW5ldyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbihUSU1FX0xJTUlUX0FUVFJfSUQsICJUaW1lTGltaXQiLCAgLy8kTk9OLU5MUy0xJAotCQkJCU1lc3NhZ2VzLlNMVVJNSm9iQXR0cmlidXRlc18xLCB0cnVlLCAxKTsKLQotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZURlZmluaXRpb248Pyw/LD8+W10gZ2V0RGVmYXVsdEF0dHJpYnV0ZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVEZWZpbml0aW9uW117Ci0JCQkJbnVtTm9kZXNBdHRyRGVmLAotCQkJCXRpbWVMaW1pdEF0dHJEZWYsCi0JCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0TnVtYmVyT2ZOb2Rlc0F0dHJpYnV0ZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudW1Ob2Rlc0F0dHJEZWY7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRUaW1lTGltaXRBdHRyaWJ1dGVEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGltZUxpbWl0QXR0ckRlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL1NMVVJNUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvU0xVUk1QcmVmZXJlbmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUxYzQwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvU0xVUk1QcmVmZXJlbmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlUHJveHlPcHRpb25zOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7DQotDQotcHVibGljIGNsYXNzIFNMVVJNUHJlZmVyZW5jZU1hbmFnZXIgew0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9FWEVDVVRBQkxFX05BTUUgPSAicHRwX3NsdXJtX3Byb3h5LnB5IjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0VYRUNVVEFCTEVfUEFUSCA9IG51bGw7IC8vIHVzZSBsb2NhbCBmcmFnbWVudCBkaXJlY3RvcnkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QVElPTlMgPSBJUmVtb3RlUHJveHlPcHRpb25zLlBPUlRfRk9SV0FSRElORzsNCi0JDQotCXB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRPcHRpb25zKCkgew0KLQkJcmV0dXJuIE9QVElPTlM7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb3h5RXhlY3V0YWJsZVBhdGgoKSB7DQotCQlyZXR1cm4gUFJPWFlfRVhFQ1VUQUJMRV9QQVRIOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7DQotCQlyZXR1cm4gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgew0KLQkJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsNCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOw0KLQkJDQotCQlTdHJpbmcgc2VydmVyID0gIiI7DQotCQkJDQotCQlpZiAoUFJPWFlfRVhFQ1VUQUJMRV9QQVRIICE9IG51bGwpIHsNCi0JCQkvL3NlcnZlciA9IG5ldyBQYXRoKFBST1hZX0VYRUNVVEFCTEVfUEFUSCkuYXBwZW5kKFBST1hZX0VYRUNVVEFCTEVfTkFNRSkudG9PU1N0cmluZygpOw0KLQkJfSBlbHNlIHsNCi0JCQkvL3NlcnZlciA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvY2F0ZUZyYWdtZW50RmlsZSgib3JnLmVjbGlwc2UucHRwIiwgUFJPWFlfRVhFQ1VUQUJMRV9OQU1FKTsNCi0JCQlpZiAoc2VydmVyID09IG51bGwpIHsNCi0JCQkJc2VydmVyID0gIiI7DQotCQkJfQ0KLSAgICAgICB9DQotCQkNCi0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9QQVRILCBzZXJ2ZXIpOw0KLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLk9QVElPTlMsIE9QVElPTlMpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvbWVzc2FnZXMvTWVzc2FnZXMuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2ODliNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IA0KLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQ0KLSAqDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAJCQlQZWljaGFuZyBTaGkgPHBjbXV0YXRlc0AxNjMuY29tPi88cGNzaGlAbnVkdC5lZHUuY24+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5tZXNzYWdlczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUubWVzc2FnZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNSm9iQXR0cmlidXRlc18wOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUpvYkF0dHJpYnV0ZXNfMTsNCi0JDQotCXN0YXRpYyB7DQotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQ0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotDQotCXByaXZhdGUgTWVzc2FnZXMoKSB7DQotCQkvLyBQcmV2ZW50IGluc3RhbmNlcy4NCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTg2OTAuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9tZXNzYWdlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1TTFVSTUpvYkF0dHJpYnV0ZXNfMD1OdW1iZXIgb2YgTm9kZXMNCi1TTFVSTUpvYkF0dHJpYnV0ZXNfMT1Kb2IgVGltZSBMaW1pdA0KLQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vU0xVUk1SZXNvdXJjZU1hbmFnZXIuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vU0xVUk1SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1OGFmNi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3Jtc3lzdGVtL1NMVVJNUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW07DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBOb2RlQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQUHJvY2Vzc0NvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFF1ZXVlQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklQVW5pdmVyc2VDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5ydHN5c3RlbS5TTFVSTVByb3h5UnVudGltZUNsaWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucnRzeXN0ZW0uU0xVUk1SdW50aW1lU3lzdGVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSdW50aW1lUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5JUnVudGltZVN5c3RlbTsNCi0NCi1wdWJsaWMgY2xhc3MgU0xVUk1SZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIgew0KLQ0KLQlwcml2YXRlIEludGVnZXIgU0xVUk1STUlEOw0KLQkNCi0JcHVibGljIFNMVVJNUmVzb3VyY2VNYW5hZ2VyKEludGVnZXIgaWQsIElQVW5pdmVyc2VDb250cm9sIHVuaXZlcnNlLCBJUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsNCi0JCXN1cGVyKGlkLnRvU3RyaW5nKCksIHVuaXZlcnNlLCBjb25maWcpOw0KLQkJU0xVUk1STUlEID0gaWQ7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQWZ0ZXJDbG9zZUNvbm5lY3Rpb24oKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgZG9BZnRlckNsb3NlQ29ubmVjdGlvbigpIHsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UHJveHlSZXNvdXJjZU1hbmFnZXIjZG9BZnRlck9wZW5Db25uZWN0aW9uKCkNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRvQWZ0ZXJPcGVuQ29ubmVjdGlvbigpIHsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UHJveHlSZXNvdXJjZU1hbmFnZXIjZG9CZWZvcmVDbG9zZUNvbm5lY3Rpb24oKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVDbG9zZUNvbm5lY3Rpb24oKSB7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFByb3h5UmVzb3VyY2VNYW5hZ2VyI2RvQmVmb3JlT3BlbkNvbm5lY3Rpb24oKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgZG9CZWZvcmVPcGVuQ29ubmVjdGlvbigpIHsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZUpvYihvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBRdWV1ZUNvbnRyb2wsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBKb2JDb250cm9sIGRvQ3JlYXRlSm9iKElQUXVldWVDb250cm9sIHF1ZXVlLCBTdHJpbmcgam9iSWQsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiBuZXdKb2IocXVldWUsIGpvYklkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVNYWNoaW5lKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBNYWNoaW5lQ29udHJvbCBkb0NyZWF0ZU1hY2hpbmUoU3RyaW5nIG1hY2hpbmVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld01hY2hpbmUobWFjaGluZUlkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVOb2RlKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZU1hbmFnZXIpDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElQTm9kZUNvbnRyb2wgZG9DcmVhdGVOb2RlKElQTWFjaGluZUNvbnRyb2wgbWFjaGluZSwgU3RyaW5nIG5vZGVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld05vZGUobWFjaGluZSwgbm9kZUlkLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9DcmVhdGVQcm9jZXNzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUEpvYkNvbnRyb2wsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBQcm9jZXNzQ29udHJvbCBkb0NyZWF0ZVByb2Nlc3MoSVBKb2JDb250cm9sIGpvYiwgU3RyaW5nIHByb2Nlc3NJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld1Byb2Nlc3Moam9iLCBwcm9jZXNzSWQsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVF1ZXVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVBRdWV1ZUNvbnRyb2wgZG9DcmVhdGVRdWV1ZShTdHJpbmcgcXVldWVJZCwgQXR0cmlidXRlTWFuYWdlciBhdHRycykgew0KLQkJcmV0dXJuIG5ld1F1ZXVlKHF1ZXVlSWQsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJUnVudGltZVN5c3RlbSBkb0NyZWF0ZVJ1bnRpbWVTeXN0ZW0oKSB7DQotCQlTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gKFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbikgZ2V0Q29uZmlndXJhdGlvbigpOw0KLQkJLyogbG9hZCB1cCB0aGUgY29udHJvbCBhbmQgbW9uaXRvcmluZyBzeXN0ZW1zIGZvciBPTVBJICovDQotCQlTTFVSTVByb3h5UnVudGltZUNsaWVudCBydW50aW1lUHJveHkgPSBuZXcgU0xVUk1Qcm94eVJ1bnRpbWVDbGllbnQoY29uZmlnLCBTTFVSTVJNSUQpOw0KLQkJcmV0dXJuIG5ldyBTTFVSTVJ1bnRpbWVTeXN0ZW0ocnVudGltZVByb3h5LCBnZXRBdHRyaWJ1dGVEZWZpbml0aW9uTWFuYWdlcigpKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZUpvYnMob3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMuSVBRdWV1ZSwgamF2YS51dGlsLkNvbGxlY3Rpb24sIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmF0dHJpYnV0ZXMuQXR0cmlidXRlTWFuYWdlcikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZUpvYnMoSVBRdWV1ZUNvbnRyb2wgcXVldWUsIENvbGxlY3Rpb248SVBKb2JDb250cm9sPiBqb2JzLA0KLQkJCUF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiB1cGRhdGVKb2JzKHF1ZXVlLCBqb2JzLCBhdHRycyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJ1bnRpbWVSZXNvdXJjZU1hbmFnZXIjZG9VcGRhdGVNYWNoaW5lcyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlTWFjaGluZXMoQ29sbGVjdGlvbjxJUE1hY2hpbmVDb250cm9sPiBtYWNoaW5lcywNCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlTWFjaGluZXMobWFjaGluZXMsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZU5vZGVzKG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUE1hY2hpbmVDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlTm9kZXMoSVBNYWNoaW5lQ29udHJvbCBtYWNoaW5lLCANCi0JCQlDb2xsZWN0aW9uPElQTm9kZUNvbnRyb2w+IG5vZGVzLCBBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlTm9kZXMobWFjaGluZSwgbm9kZXMsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZVByb2Nlc3NlcyhvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50Y29udHJvbHMuSVBKb2JDb250cm9sLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlUHJvY2Vzc2VzKElQSm9iQ29udHJvbCBqb2IsDQotCQkJQ29sbGVjdGlvbjxJUFByb2Nlc3NDb250cm9sPiBwcm9jZXNzZXMsIEF0dHJpYnV0ZU1hbmFnZXIgYXR0cnMpIHsNCi0JCXJldHVybiB1cGRhdGVQcm9jZXNzZXMoam9iLCBwcm9jZXNzZXMsIGF0dHJzKTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLkFic3RyYWN0UnVudGltZVJlc291cmNlTWFuYWdlciNkb1VwZGF0ZVF1ZXVlcyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5BdHRyaWJ1dGVNYW5hZ2VyKQ0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGRvVXBkYXRlUXVldWVzKENvbGxlY3Rpb248SVBRdWV1ZUNvbnRyb2w+IHF1ZXVlcywNCi0JCQlBdHRyaWJ1dGVNYW5hZ2VyIGF0dHJzKSB7DQotCQlyZXR1cm4gdXBkYXRlUXVldWVzKHF1ZXVlcywgYXR0cnMpOw0KLQl9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3Jtc3lzdGVtL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2IzYjMxLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5yZW1vdGUuY29yZS5BYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87DQotDQotZmluYWwgcHVibGljIGNsYXNzIFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBleHRlbmRzDQotCQlBYnN0cmFjdFJlbW90ZVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBDbG9uZWFibGUgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NMVVJNRF9QQVRIID0gInNsdXJtZFBhdGgiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0xVUk1EX0FSR1MgPSAic2x1cm1kQXJncyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TTFVSTURfREVGQVVMVFMgPSAic2x1cm1kRGVmYXVsdHMiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBAcGFyYW0gZmFjdG9yeQ0KLQkgKiBAcGFyYW0gbWVtZW50bw0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWQoDQotCQkJU0xVUk1SZXNvdXJjZU1hbmFnZXJGYWN0b3J5IGZhY3RvcnksIElNZW1lbnRvIG1lbWVudG8pIHsNCi0NCi0JCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBsb2FkUmVtb3RlKGZhY3RvcnksIG1lbWVudG8pOw0KLQ0KLQkJU3RyaW5nIHNsdXJtZFBhdGggPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfU0xVUk1EX1BBVEgpOw0KLQkJU3RyaW5nIHNsdXJtZEFyZ3MgPSBtZW1lbnRvLmdldFN0cmluZyhUQUdfU0xVUk1EX0FSR1MpOw0KLQkJYm9vbGVhbiB1c2VEZWZhdWx0cyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG1lbWVudG8NCi0JCQkJLmdldFN0cmluZyhUQUdfU0xVUk1EX0RFRkFVTFRTKSk7DQotDQotCQlTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbigNCi0JCQkJZmFjdG9yeSwgcmVtb3RlQ29uZmlnLCBzbHVybWRQYXRoLCBzbHVybWRBcmdzLCB1c2VEZWZhdWx0cyk7DQotDQotCQlyZXR1cm4gY29uZmlnOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIHNsdXJtZFBhdGg7DQotCXByaXZhdGUgU3RyaW5nIHNsdXJtZEFyZ3M7DQotCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0czsNCi0NCi0JcHVibGljIFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbihTTFVSTVJlc291cmNlTWFuYWdlckZhY3RvcnkgZmFjdG9yeSkgew0KLQkJdGhpcyhmYWN0b3J5LCBuZXcgUmVtb3RlQ29uZmlnKCksIEVNUFRZX1NUUklORywgRU1QVFlfU1RSSU5HLCB0cnVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKFNMVVJNUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBmYWN0b3J5LA0KLQkJCVJlbW90ZUNvbmZpZyBjb25maWcsIFN0cmluZyBzbHVybWRQYXRoLCBTdHJpbmcgc2x1cm1kQXJncywNCi0JCQlib29sZWFuIHVzZURlZmF1bHRzKSB7DQotCQlzdXBlcihjb25maWcsIGZhY3RvcnkpOw0KLQkJc2V0U2x1cm1kUGF0aChzbHVybWRQYXRoKTsNCi0JCXNldFNsdXJtZEFyZ3Moc2x1cm1kQXJncyk7DQotCQlzZXRVc2VEZWZhdWx0cyh1c2VEZWZhdWx0cyk7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgew0KLQkJQ29tbW9uQ29uZmlnIGNvbW1vbkNvbmYgPSBuZXcgQ29tbW9uQ29uZmlnKGdldE5hbWUoKSwNCi0JCQkJZ2V0RGVzY3JpcHRpb24oKSwgZ2V0VW5pcXVlTmFtZSgpLA0KLQkJCQlnZXRSZW1vdGVTZXJ2aWNlc0lkKCksIGdldENvbm5lY3Rpb25OYW1lKCkpOw0KLQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmYgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbW1vbkNvbmYsDQotCQkJCWdldFByb3h5U2VydmVyUGF0aCgpLCBnZXRMb2NhbEFkZHJlc3MoKSwNCi0JCQkJZ2V0SW52b2NhdGlvbk9wdGlvbnNTdHIoKSwgZ2V0T3B0aW9ucygpKTsNCi0JCXJldHVybiBuZXcgU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKA0KLQkJCQkoU0xVUk1SZXNvdXJjZU1hbmFnZXJGYWN0b3J5KSBnZXRGYWN0b3J5KCksIHJlbW90ZUNvbmYsDQotCQkJCWdldFNsdXJtZFBhdGgoKSwgZ2V0U2x1cm1kQXJncygpLCB1c2VEZWZhdWx0cygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2x1cm1kQXJncw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTbHVybWRBcmdzKCkgew0KLQkJcmV0dXJuIHNsdXJtZEFyZ3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHNsdXJtZFBhdGgNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0U2x1cm1kUGF0aCgpIHsNCi0JCXJldHVybiBzbHVybWRQYXRoOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uI3NhdmUob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsNCi0JCXN1cGVyLnNhdmUobWVtZW50byk7DQotCQltZW1lbnRvLnB1dFN0cmluZyhUQUdfU0xVUk1EX1BBVEgsIHNsdXJtZFBhdGgpOw0KLQkJbWVtZW50by5wdXRTdHJpbmcoVEFHX1NMVVJNRF9BUkdTLCBzbHVybWRBcmdzKTsNCi0JCW1lbWVudG8ucHV0U3RyaW5nKFRBR19TTFVSTURfREVGQVVMVFMsIEJvb2xlYW4udG9TdHJpbmcodXNlRGVmYXVsdHMpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiNzZXREZWZhdWx0TmFtZUFuZERlc2MoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVBbmREZXNjKCkgew0KLQkJU3RyaW5nIG5hbWUgPSAiU0xVUk0iOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgY29ubiA9IGdldENvbm5lY3Rpb25OYW1lKCk7DQotCQlpZiAoY29ubiAhPSBudWxsICYmICFjb25uLmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7DQotCQkJbmFtZSArPSAiQCIgKyBjb25uOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlzZXROYW1lKG5hbWUpOw0KLQkJc2V0RGVzY3JpcHRpb24oIlNMVVJNIFJlc291cmNlIE1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gc2x1cm1kQXJndW1lbnRzDQotCSAqICAgICAgICAgICAgdGhlIHNsdXJtZEFyZ3MgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTbHVybWRBcmdzKFN0cmluZyBzbHVybWRBcmdzKSB7DQotCQl0aGlzLnNsdXJtZEFyZ3MgPSBzbHVybWRBcmdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gc2x1cm1kUGF0aA0KLQkgKiAgICAgICAgICAgIHRoZSBzbHVybWRQYXRoIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2x1cm1kUGF0aChTdHJpbmcgc2x1cm1kUGF0aCkgew0KLQkJdGhpcy5zbHVybWRQYXRoID0gc2x1cm1kUGF0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHVzZURlZmF1bHRzDQotCSAqICAgICAgICAgICAgdGhlIHVzZURlZmF1bHRzIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdHMoYm9vbGVhbiB1c2VEZWZhdWx0cykgew0KLQkJdGhpcy51c2VEZWZhdWx0cyA9IHVzZURlZmF1bHRzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSB1c2VEZWZhdWx0cw0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdXNlRGVmYXVsdHMoKSB7DQotCQlyZXR1cm4gdXNlRGVmYXVsdHM7DQotCX0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ybXN5c3RlbS9TTFVSTVJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcm1zeXN0ZW0vU0xVUk1SZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODYxZTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ybXN5c3RlbS9TTFVSTVJlc291cmNlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLlBUUENvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRjb250cm9scy5JUFVuaXZlcnNlQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudGNvbnRyb2xzLklSZXNvdXJjZU1hbmFnZXJDb250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLlNMVVJNUHJlZmVyZW5jZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5BYnN0cmFjdFJlc291cmNlTWFuYWdlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87DQotDQotcHVibGljIGNsYXNzIFNMVVJNUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VNYW5hZ2VyRmFjdG9yeSB7DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uQWJzdHJhY3RSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24pDQotCSAqLw0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbnRyb2wgY3JlYXRlKElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZJbikgew0KLQkJU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uKSBjb25mSW47DQotCQlmaW5hbCBQVFBDb3JlUGx1Z2luIHBsdWdpbiA9IFBUUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOw0KLQkJZmluYWwgSVBVbml2ZXJzZUNvbnRyb2wgdW5pdmVyc2UgPSAoSVBVbml2ZXJzZUNvbnRyb2wpIHBsdWdpbi5nZXRVbml2ZXJzZSgpOw0KLQkJcmV0dXJuIG5ldyBTTFVSTVJlc291cmNlTWFuYWdlcih1bml2ZXJzZS5nZXROZXh0UmVzb3VyY2VNYW5hZ2VySWQoKSwgdW5pdmVyc2UsIGNvbmZpZ3VyYXRpb24pOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlckZhY3RvcnkjY3JlYXRlQ29uZmlndXJhdGlvbigpDQotCSAqLw0KLQlwdWJsaWMgSVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpIHsNCi0JCVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbih0aGlzKTsNCi0JCQ0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBTTFVSTVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VzKCk7DQotCQkNCi0JCWNvbmYuc2V0UHJveHlTZXJ2ZXJQYXRoKHByZWZlcmVuY2VzLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1BBVEgpKTsNCi0JCWNvbmYuc2V0T3B0aW9ucyhwcmVmZXJlbmNlcy5nZXRJbnQoUHJlZmVyZW5jZUNvbnN0YW50cy5PUFRJT05TKSk7DQotDQotCQlyZXR1cm4gY29uZjsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXJGYWN0b3J5I2xvYWRDb25maWd1cmF0aW9uKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQ0KLQkgKi8NCi0JcHVibGljIElSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGxvYWRDb25maWd1cmF0aW9uKElNZW1lbnRvIG1lbWVudG8pIHsNCi0JCXJldHVybiBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24ubG9hZCh0aGlzLCBtZW1lbnRvKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlDb21tYW5kRmFjdG9yeS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVByb3h5Q29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyODMzNS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJ0c3lzdGVtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkuY29tbWFuZC5JUHJveHlDb21tYW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucGFja2V0LlByb3h5UGFja2V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lSW5pdENvbW1hbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5Qcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBTTFVSTVByb3h5Q29tbWFuZEZhY3RvcnkgaW1wbGVtZW50cyBJUHJveHlSdW50aW1lQ29tbWFuZEZhY3Rvcnkgew0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTTFVSTURfUEFUSF9BVFRSID0gInNsdXJtZFBhdGgiOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTTFVSTURfQVJHU19BVFRSID0gInNsdXJtZEFyZ3MiOw0KLQkNCi0JcHJpdmF0ZSBJUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkgZmFjdG9yeTsNCi0JcHJpdmF0ZSBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnOw0KLQkNCi0JcHVibGljIFNMVVJNUHJveHlDb21tYW5kRmFjdG9yeShTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7DQotCQl0aGlzLmZhY3RvcnkgPSBuZXcgUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkoKTsNCi0JCXRoaXMuY29uZmlnID0gY29uZmlnOw0KLQl9DQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkjbmV3UHJveHlSdW50aW1lSW5pdENvbW1hbmQoaW50KQ0KLQkgKi8NCi0JcHVibGljIElQcm94eVJ1bnRpbWVJbml0Q29tbWFuZCBuZXdQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChpbnQgYmFzZUlkKSB7DQotCQlJUHJveHlSdW50aW1lSW5pdENvbW1hbmQgY21kID0gZmFjdG9yeS5uZXdQcm94eVJ1bnRpbWVJbml0Q29tbWFuZChiYXNlSWQpOw0KLQkJaWYgKCFjb25maWcudXNlRGVmYXVsdHMoKSkgew0KLQkJCWlmICghY29uZmlnLmdldFNsdXJtZFBhdGgoKS5lcXVhbHMoIiIpKSB7DQotCQkJCWNtZC5hZGRBcmd1bWVudChTTFVSTURfUEFUSF9BVFRSICsgIj0iICsgY29uZmlnLmdldFNsdXJtZFBhdGgoKSk7DQotCQkJfQ0KLQkJCWlmICghY29uZmlnLmdldFNsdXJtZEFyZ3MoKS5lcXVhbHMoIiIpKSB7DQotCQkJCWZvciAoU3RyaW5nIGFyZyA6IGNvbmZpZy5nZXRTbHVybWRBcmdzKCkuc3BsaXQoIiAiKSkgew0KLQkJCQkJY21kLmFkZEFyZ3VtZW50KFNMVVJNRF9BUkdTX0FUVFIgKyAiPSIgKyBhcmcpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGNtZDsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnByb3h5LnJ1bnRpbWUuY29tbWFuZC5JUHJveHlSdW50aW1lQ29tbWFuZEZhY3RvcnkjbmV3UHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kKCkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lTW9kZWxEZWZDb21tYW5kIG5ld1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpIHsNCi0JCXJldHVybiBmYWN0b3J5Lm5ld1Byb3h5UnVudGltZU1vZGVsRGVmQ29tbWFuZCgpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQoKQ0KLQkgKi8NCi0JcHVibGljIElQcm94eVJ1bnRpbWVTdGFydEV2ZW50c0NvbW1hbmQgbmV3UHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCkgew0KLQkJcmV0dXJuIGZhY3RvcnkubmV3UHJveHlSdW50aW1lU3RhcnRFdmVudHNDb21tYW5kKCk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5I25ld1Byb3h5UnVudGltZVN0b3BFdmVudHNDb21tYW5kKCkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQgbmV3UHJveHlSdW50aW1lU3RvcEV2ZW50c0NvbW1hbmQoKSB7DQotCQlyZXR1cm4gZmFjdG9yeS5uZXdQcm94eVJ1bnRpbWVTdG9wRXZlbnRzQ29tbWFuZCgpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucHJveHkucnVudGltZS5jb21tYW5kLklQcm94eVJ1bnRpbWVDb21tYW5kRmFjdG9yeSNuZXdQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kKGphdmEubGFuZy5TdHJpbmdbXSkNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lU3VibWl0Sm9iQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVTdWJtaXRKb2JDb21tYW5kKA0KLQkJCVN0cmluZ1tdIGFyZ3MpIHsNCi0JCXJldHVybiBmYWN0b3J5Lm5ld1Byb3h5UnVudGltZVN1Ym1pdEpvYkNvbW1hbmQoYXJncyk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmNvbW1hbmQuSVByb3h5UnVudGltZUNvbW1hbmRGYWN0b3J5I25ld1Byb3h5UnVudGltZVRlcm1pbmF0ZUpvYkNvbW1hbmQoamF2YS5sYW5nLlN0cmluZykNCi0JICovDQotCXB1YmxpYyBJUHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZCBuZXdQcm94eVJ1bnRpbWVUZXJtaW5hdGVKb2JDb21tYW5kKA0KLQkJCVN0cmluZyBqb2JJZCkgew0KLQkJcmV0dXJuIGZhY3RvcnkubmV3UHJveHlSdW50aW1lVGVybWluYXRlSm9iQ29tbWFuZChqb2JJZCk7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5wcm94eS5jb21tYW5kLlByb3h5Q29tbWFuZEZhY3RvcnkjdG9Db21tYW5kKG9yZy5lY2xpcHNlLnB0cC5wcm94eS5wYWNrZXQuUHJveHlQYWNrZXQpDQotCSAqLw0KLQlwdWJsaWMgSVByb3h5Q29tbWFuZCB0b0NvbW1hbmQoUHJveHlQYWNrZXQgcGFja2V0KSB7DQotCQlyZXR1cm4gZmFjdG9yeS50b0NvbW1hbmQocGFja2V0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlSdW50aW1lQ2xpZW50LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS9jb3JlL3J0c3lzdGVtL1NMVVJNUHJveHlSdW50aW1lQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTgzOTMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVByb3h5UnVudGltZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucnRzeXN0ZW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wcm94eS5ydW50aW1lLmV2ZW50LlByb3h5UnVudGltZUV2ZW50RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVDbGllbnQ7DQotDQotcHVibGljIGNsYXNzIFNMVVJNUHJveHlSdW50aW1lQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVDbGllbnQgew0KLQlwdWJsaWMgU0xVUk1Qcm94eVJ1bnRpbWVDbGllbnQoU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uIGNvbmZpZywgDQotCQkJaW50IGJhc2VNb2RlbElkKSB7DQotCQlzdXBlcihjb25maWcsIGJhc2VNb2RlbElkLCBuZXcgU0xVUk1Qcm94eUNvbW1hbmRGYWN0b3J5KGNvbmZpZyksIG5ldyBQcm94eVJ1bnRpbWVFdmVudEZhY3RvcnkoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVJ1bnRpbWVTeXN0ZW0uamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL2NvcmUvcnRzeXN0ZW0vU0xVUk1SdW50aW1lU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDU1MmIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vY29yZS9ydHN5c3RlbS9TTFVSTVJ1bnRpbWVTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJ0c3lzdGVtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZURlZmluaXRpb25NYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLmNvcmUuQWJzdHJhY3RSZW1vdGVQcm94eVJ1bnRpbWVTeXN0ZW07DQotDQotcHVibGljIGNsYXNzIFNMVVJNUnVudGltZVN5c3RlbSBleHRlbmRzIEFic3RyYWN0UmVtb3RlUHJveHlSdW50aW1lU3lzdGVtIHsNCi0JcHVibGljIFNMVVJNUnVudGltZVN5c3RlbShTTFVSTVByb3h5UnVudGltZUNsaWVudCBwcm94eSwgQXR0cmlidXRlRGVmaW5pdGlvbk1hbmFnZXIgbWFuYWdlcikgew0KLQkJc3VwZXIocHJveHksIG1hbmFnZXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvLmNwcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS8uY3Byb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MWI2NTguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS8uY3Byb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZmlsZVZlcnNpb24gNC4wLjA/PgotCi08Y3Byb2plY3Qgc3RvcmFnZV90eXBlX2lkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5YbWxQcm9qZWN0RGVzY3JpcHRpb25TdG9yYWdlIj4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyI+Ci08Y2NvbmZpZ3VyYXRpb24gaWQ9IjAuMTQ1MTA5Nzk5OSI+Ci08c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iMC4xNDUxMDk3OTk5IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9IkRlZmF1bHQiPgotPGV4dGVybmFsU2V0dGluZ3MvPgotPGV4dGVuc2lvbnM+Ci08ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5WQ0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdMREVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4KLTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLk1ha2VFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+Ci08L2V4dGVuc2lvbnM+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4KLTxjb25maWd1cmF0aW9uIGFydGlmYWN0TmFtZT0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5IiBidWlsZFByb3BlcnRpZXM9IiIgZGVzY3JpcHRpb249IiIgaWQ9IjAuMTQ1MTA5Nzk5OSIgbmFtZT0iRGVmYXVsdCIgcGFyZW50PSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5wcmVmYmFzZS5jZmciPgotPGZvbGRlckluZm8gaWQ9IjAuMTQ1MTA5Nzk5OS4iIG5hbWU9Ii8iIHJlc291cmNlUGF0aD0iIj4KLTx0b29sQ2hhaW4gaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnByZWZiYXNlLnRvb2xjaGFpbi4xOTM5NjY1NTU1IiBuYW1lPSJObyBUb29sQ2hhaW4iIHJlc291cmNlVHlwZUJhc2VkRGlzY292ZXJ5PSJmYWxzZSIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUucHJlZmJhc2UudG9vbGNoYWluIj4KLTx0YXJnZXRQbGF0Zm9ybSBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUucHJlZmJhc2UudG9vbGNoYWluLjE5Mzk2NjU1NTUuMTQxNTIxMzMxNCIgbmFtZT0iIi8+Ci08YnVpbGRlciBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuZGVmYXVsdC5idWlsZGVyLjM3OTUwMzk2NyIga2VlcEVudmlyb25tZW50SW5CdWlsZGZpbGU9ImZhbHNlIiBtYW5hZ2VkQnVpbGRPbj0iZmFsc2UiIG5hbWU9IkdudSBNYWtlIEJ1aWxkZXIiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmRlZmF1bHQuYnVpbGRlciIvPgotPHRvb2wgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci5saWJzLjE4MzUzMTM0ODAiIG5hbWU9ImhvbGRlciBmb3IgbGlicmFyeSBzZXR0aW5ncyIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmxpYnMiLz4KLTx0b29sIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuMzU0MjI2NTYxIiBuYW1lPSJHTlUgQysrIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIiPgotPGlucHV0VHlwZSBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmluVHlwZS45MDkxNzY3ODAiIGxhbmd1YWdlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmcrKyIgbGFuZ3VhZ2VOYW1lPSJHTlUgQysrIiBzb3VyY2VDb250ZW50VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuY3h4U291cmNlLG9yZy5lY2xpcHNlLmNkdC5jb3JlLmN4eEhlYWRlciIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmluVHlwZSIvPgotPC90b29sPgotPHRvb2wgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci40MTk0MTMwMjkiIG5hbWU9IkdOVSBDIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIiPgotPGlucHV0VHlwZSBpZD0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuc2V0dGluZ3MuaG9sZGVyLmluVHlwZS4xMzAxNzM5MTM0IiBsYW5ndWFnZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5nY2MiIGxhbmd1YWdlTmFtZT0iR05VIEMiIHNvdXJjZUNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5jU291cmNlLG9yZy5lY2xpcHNlLmNkdC5jb3JlLmNIZWFkZXIiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlci5pblR5cGUiLz4KLTwvdG9vbD4KLTx0b29sIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuMTI0NjQ3MTQ0OSIgbmFtZT0iQXNzZW1ibHkiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLnNldHRpbmdzLmhvbGRlciI+Ci08aW5wdXRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlLjIxMzUyMjkzMjciIGxhbmd1YWdlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmFzc2VtYmx5IiBsYW5ndWFnZU5hbWU9IkFzc2VtYmx5IiBzb3VyY2VDb250ZW50VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuYXNtU291cmNlIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5zZXR0aW5ncy5ob2xkZXIuaW5UeXBlIi8+Ci08L3Rvb2w+Ci08L3Rvb2xDaGFpbj4KLTwvZm9sZGVySW5mbz4KLTwvY29uZmlndXJhdGlvbj4KLTwvc3RvcmFnZU1vZHVsZT4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJzY2FubmVyQ29uZmlndXJhdGlvbiI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxzY2FubmVyQ29uZmlnQnVpbGRJbmZvIGluc3RhbmNlSWQ9IjAuMTQ1MTA5Nzk5OSI+Ci08YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuR0NDU3RhbmRhcmRNYWtlUGVyUHJvamVjdFByb2ZpbGUiLz4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLkdDQ1N0YW5kYXJkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5HQ0NTdGFuZGFyZE1ha2VQZXJGaWxlUHJvZmlsZSI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9Im1ha2VmaWxlR2VuZXJhdG9yIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItZiAke3Byb2plY3RfbmFtZX1fc2NkLm1rIiBjb21tYW5kPSJtYWtlIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NNYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTxwcm9maWxlIGlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5HQ0NXaW5NYW5hZ2VkTWFrZVBlclByb2plY3RQcm9maWxlIj4KLTxidWlsZE91dHB1dFByb3ZpZGVyPgotPG9wZW5BY3Rpb24gZW5hYmxlZD0idHJ1ZSIgZmlsZVBhdGg9IiIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L2J1aWxkT3V0cHV0UHJvdmlkZXI+Ci08c2Nhbm5lckluZm9Qcm92aWRlciBpZD0ic3BlY3NGaWxlIj4KLTxydW5BY3Rpb24gYXJndW1lbnRzPSItRSAtUCAtdiAtZEQgJHtwbHVnaW5fc3RhdGVfbG9jYXRpb259LyR7c3BlY3NfZmlsZX0iIGNvbW1hbmQ9ImdjYyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUNQUCI+Ci08YnVpbGRPdXRwdXRQcm92aWRlcj4KLTxvcGVuQWN0aW9uIGVuYWJsZWQ9InRydWUiIGZpbGVQYXRoPSIiLz4KLTxwYXJzZXIgZW5hYmxlZD0idHJ1ZSIvPgotPC9idWlsZE91dHB1dFByb3ZpZGVyPgotPHNjYW5uZXJJbmZvUHJvdmlkZXIgaWQ9InNwZWNzRmlsZSI+Ci08cnVuQWN0aW9uIGFyZ3VtZW50cz0iLUUgLVAgLXYgLWREICR7cGx1Z2luX3N0YXRlX2xvY2F0aW9ufS9zcGVjcy5jcHAiIGNvbW1hbmQ9ImcrKyIgdXNlRGVmYXVsdD0idHJ1ZSIvPgotPHBhcnNlciBlbmFibGVkPSJ0cnVlIi8+Ci08L3NjYW5uZXJJbmZvUHJvdmlkZXI+Ci08L3Byb2ZpbGU+Ci08cHJvZmlsZSBpZD0ib3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuR0NDV2luTWFuYWdlZE1ha2VQZXJQcm9qZWN0UHJvZmlsZUMiPgotPGJ1aWxkT3V0cHV0UHJvdmlkZXI+Ci08b3BlbkFjdGlvbiBlbmFibGVkPSJ0cnVlIiBmaWxlUGF0aD0iIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvYnVpbGRPdXRwdXRQcm92aWRlcj4KLTxzY2FubmVySW5mb1Byb3ZpZGVyIGlkPSJzcGVjc0ZpbGUiPgotPHJ1bkFjdGlvbiBhcmd1bWVudHM9Ii1FIC1QIC12IC1kRCAke3BsdWdpbl9zdGF0ZV9sb2NhdGlvbn0vc3BlY3MuYyIgY29tbWFuZD0iZ2NjIiB1c2VEZWZhdWx0PSJ0cnVlIi8+Ci08cGFyc2VyIGVuYWJsZWQ9InRydWUiLz4KLTwvc2Nhbm5lckluZm9Qcm92aWRlcj4KLTwvcHJvZmlsZT4KLTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4KLTwvc3RvcmFnZU1vZHVsZT4KLTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIi8+Ci08L2Njb25maWd1cmF0aW9uPgotPC9zdG9yYWdlTW9kdWxlPgotPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+Ci08cHJvamVjdCBpZD0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5Lm51bGwuMTY0Nzc0Nzg4NSIgbmFtZT0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5Ii8+Ci08L3N0b3JhZ2VNb2R1bGU+Ci08L2Nwcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS8ucHJvamVjdCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOGQ4NDMuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmdlbm1ha2VidWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmNsZWFuLGZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+P25hbWU/PC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFwcGVuZF9lbnZpcm9ubWVudDwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuYXV0b0J1aWxkVGFyZ2V0PC9rZXk+Ci0JCQkJCTx2YWx1ZT5hbGw8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkQXJndW1lbnRzPC9rZXk+Ci0JCQkJCTx2YWx1ZT48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmJ1aWxkQ29tbWFuZDwva2V5PgotCQkJCQk8dmFsdWU+bWFrZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUuY2xlYW5CdWlsZFRhcmdldDwva2V5PgotCQkJCQk8dmFsdWU+Y2xlYW48L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmNvbnRlbnRzPC9rZXk+Ci0JCQkJCTx2YWx1ZT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmFjdGl2ZUNvbmZpZ1NldHRpbmdzPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVBdXRvQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPmZhbHNlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVDbGVhbkJ1aWxkPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5lbmFibGVGdWxsQnVpbGQ8L2tleT4KLQkJCQkJPHZhbHVlPnRydWU8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5vcmcuZWNsaXBzZS5jZHQubWFrZS5jb3JlLmZ1bGxCdWlsZFRhcmdldDwva2V5PgotCQkJCQk8dmFsdWU+YWxsPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+b3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5zdG9wT25FcnJvcjwva2V5PgotCQkJCQk8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5Pm9yZy5lY2xpcHNlLmNkdC5tYWtlLmNvcmUudXNlRGVmYXVsdEJ1aWxkQ21kPC9rZXk+Ci0JCQkJCTx2YWx1ZT50cnVlPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5TY2FubmVyQ29uZmlnQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLm1hbmFnZWRCdWlsZE5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLlNjYW5uZXJDb25maWdOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQVVUSE9SUyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQVVUSE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlZGZhMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L0FVVEhPUlMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1KaWUgSmlhbmcgPGppYW5namllQG51ZHQuZWR1LmNuPgpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9DT1BZSU5HIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzUwNThmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDA5IFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYSAKLQotVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L0NoYW5nZUxvZyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvSU5TVEFMTCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvSU5TVEFMTApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwYzQyZi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L0lOU1RBTEwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TZWUgUkVBRE1FIGZvciBidWlsZC9pbnN0YWxsIGluc3RydWN0aW9ucy4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI1Y2E3Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucm0ub3J0ZS5wcm94eQ0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1DcmVhdGVkLUJ5OiAxLjUuMF8xMy0xMTkgKEFwcGxlIEluYy4pDQotQnVuZGxlLU5hbWU6IFBUUCBQcm94eSBTZXJ2ZXIgZm9yIE9wZW5SVEUNCi1CdW5kbGUtVmVyc2lvbjogMi4wLjEuMjAwODA2MDYxNTE1DQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMA0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5wdHAudXRpbHMsb3JnLmVjbGlwc2UucHRwLnByb3h5DQotDQotTmFtZTogY29uZmlndXJlLmluDQotU0hBMS1EaWdlc3Q6IDZ6RWI3Z2xrQys4cmR3d3J4QTVLREZVT2d5ST0NCi0NCi1OYW1lOiBNYWtlZmlsZS5hbQ0KLVNIQTEtRGlnZXN0OiBST0hZdWJnSHdCWVRWUElYVE5odTRSMTEybDg9DQotDQotTmFtZTogY29uZmlndXJlDQotU0hBMS1EaWdlc3Q6IGF4Q2VQMVRsSU5LKzd3UzVsSFgyMDBSSVdLZz0NCi0NCi1OYW1lOiBDaGFuZ2VMb2cNCi1TSEExLURpZ2VzdDogMmptajdsNXJTdzB5VmIvdmxXQVlrSy9ZQndrPQ0KLQ0KLU5hbWU6IElOU1RBTEwNCi1TSEExLURpZ2VzdDogdXMwZTA3MFR1NGdYbitucXdpZmlMT0dwYklRPQ0KLQ0KLU5hbWU6IGFib3V0Lmh0bWwNCi1TSEExLURpZ2VzdDogNjd0Ujd6RGc1elpUU3FreTFIYXZTcmMrSVkwPQ0KLQ0KLU5hbWU6IGNvbXBpbGUNCi1TSEExLURpZ2VzdDogOXladHJ0cmNHa3ZoYmtieVZKdUV0d3p3SjljPQ0KLQ0KLU5hbWU6IE1ha2VmaWxlLmluDQotU0hBMS1EaWdlc3Q6IHhPdjJaKzZlTjJlUVRtbFdLb2d1ZmRrTG9paz0NCi0NCi1OYW1lOiBDT1BZSU5HDQotU0hBMS1EaWdlc3Q6IHFQZytWc2xpVFRCdTlQajVsUXpHT3lOTjYxST0NCi0NCi1OYW1lOiBzcmMvcHRwX29ydGVfcHJveHkuYw0KLVNIQTEtRGlnZXN0OiBjMjZZWENLbXlta2l1ZGlGOGc2NzdKcG00bUk9DQotDQotTmFtZTogbHRtYWluLnNoDQotU0hBMS1EaWdlc3Q6IEZSYlZJV3N5N1gzV1c2Ym1TYzFZWlg3a2lyaz0NCi0NCi1OYW1lOiBkZXBjb21wDQotU0hBMS1EaWdlc3Q6IFhYUWxxY0NLWnNNWGZ4NHhLRytrQ1liL3laWT0NCi0NCi1OYW1lOiBBVVRIT1JTDQotU0hBMS1EaWdlc3Q6IDVVUkh2Z09GTUZ0TGVxUGd3cUZvcUFFaWppMD0NCi0NCi1OYW1lOiBORVdTDQotU0hBMS1EaWdlc3Q6IDJqbWo3bDVyU3cweVZiL3ZsV0FZa0svWUJ3az0NCi0NCi1OYW1lOiBtaXNzaW5nDQotU0hBMS1EaWdlc3Q6IGhPRkpXdXZoQkxwbzhTUzhOZ2JMU2h0ZmJIbz0NCi0NCi1OYW1lOiBzcmMvb3J0ZV9maXh1cC5oDQotU0hBMS1EaWdlc3Q6IHpqZjJ0T1BaRVBPYUhObjVGV1ArM3BZTlZsbz0NCi0NCi1OYW1lOiBhY2xvY2FsLm00DQotU0hBMS1EaWdlc3Q6IC8zNmo0ZXUyUS8raU15Q2xoajhRRWtXSHFIMD0NCi0NCi1OYW1lOiBpbnN0YWxsLXNoDQotU0hBMS1EaWdlc3Q6IEt4Z2w0VVJEOHhtQXFLT29CeDJ6MWdqaVRFMD0NCi0NCi1OYW1lOiBSRUFETUUNCi1TSEExLURpZ2VzdDogM0hOQ3ppSUZERzg4NTdXY1NNOVkwWW04bkFFPQ0KLQ0KLU5hbWU6IGNvbmZpZy5oLmluDQotU0hBMS1EaWdlc3Q6IFpnOU1GaXA2REQ5bmtOK1NtdTNlR2txZXd0TT0NCi0NCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZg0KLVNIQTEtRGlnZXN0OiAwOWdOMDV0b2JnUy9NZHRxeVROUWhPaEI3M009DQotDQotTmFtZTogY29uZmlnLnN1Yg0KLVNIQTEtRGlnZXN0OiBiaXh2T2dKclNoamNWVGpnakxwanJYTUpMTzA9DQotDQotTmFtZTogY29uZmlnLnN0YXR1cw0KLVNIQTEtRGlnZXN0OiBuWVVKZ2R4YXdaYkFVVDhQbm41M2xBcUZYMlU9DQotDQotTmFtZTogY29uZmlnLmd1ZXNzDQotU0hBMS1EaWdlc3Q6IHNXQ08xREdJSFpzQWNBVjIybSszNXFLT2RnVT0NCi0NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmZmVkMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jUHJvY2Vzc2VkIHVzaW5nIEphcnByb2Nlc3NvcgotcGFjazIwMC5jb25kaXRpb25lZCA9IHRydWUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTWFrZWZpbGUuYW0gYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGU0N2E1Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotYmluX1BST0dSQU1TID0JcHRwX3NsdXJtX3Byb3h5Ci0KLXB0cF9zbHVybV9wcm94eV9TT1VSQ0VTID0Jc3JjL3B0cF9zbHVybV9wcm94eS5jIHNyYy9zcnVuX29wdC5oIAotcHRwX3NsdXJtX3Byb3h5X0NGTEFHUyA9CSQoQU1fQ0ZMQUdTKQotcHRwX3NsdXJtX3Byb3h5X0NQUEZMQVMgPSAgLUkkKFNMVVJNRElSKS9pbmNsdWRlCi1wdHBfc2x1cm1fcHJveHlfTERGTEFHUyA9IC1MJChTTFVSTURJUikvbGliCi1wdHBfc2x1cm1fcHJveHlfTERBREQgPSAJLWxzbHVybSAtbHB0aHJlYWQKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTkVXUyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L05FV1MKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9SRUFETUUgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlOWMzMC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnByb3h5L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLVRoaXMgcHJvamVjdCBjb250YWlucyB0aGUgc291cmNlIGNvZGUgb2YgdGhlIFNMVVJNIHByb3h5IHNlcnZlci4gVGhlIGZvbGxvd2luZwotc3RlcHMgYXJlIHVzZWQgdG8gc2V0IHVwIHlvdXIgYnVpbGQgZW52aXJvbm1lbnQgc28gdGhhdCB0aGUgZXhlY3V0YWJsZSB3aWxsIGJlCi1jb3JyZWN0bHkgYnVpbHQgYW5kIGluc3RhbGxlZC4gSW4gb3JkZXIgdG8gdXNlIHRoZSBzZXJ2ZXIgYmluYXJ5LCBpdCBuZWVkcyB0byAKLWJlIGluc3RhbGxlZCBpbiBhIGZyYWdtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgbWFjaGluZSAKLWl0IHdpbGwgYmUgcnVuIG9uLiAKLQotMS4gTWFrZSBzdXJlIHRoZSBTTFVSTSBybXMgaXMgaW5zdGFsbGVkIGFuZCBlbnN1cmUgaXQgd29yayB3ZWxsLiAKLSAgIFRoYXQgaXMsIFNMVVJNIGNtZCB1dGlsaXRpZXMsIHN1Y2ggYXMgInNpbmZvL3NydW4vc3F1ZXVlIiB3b3JrIGFzIGV4cGVjdGVkLgotICAgRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIFNMVVJNLCBzZWUKLSAgIGh0dHA6Ly93d3cubGxubC5nb3YvbGludXgvc2x1cm0vc2x1cm0uaHRtbAotCi0KLTIuIERvd25sb2FkIFBUUCAyLjEgZm9yIHlvdXIgcGxhdGZvcm0uIEFuZCBtb2RpZnkgcHJveHlfYXR0ci5oIHVzaW5nIGxpYnByb3h5LnBhdGNoOgotICAgKDEpIGNvcHkgbGlicHJveHkucGF0Y2ggdG8gJFBUUERJUi9jb3JlL29yZy5lY2xpcHNlLnB0cC5wcm94eQotICAgKDIpIGNkICRQVFBESVIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkKLSAgICgzKSBwYXRjaCAtcDEgPCBsaWJwcm94eS5wYXRjaAotCi0KLTMuIEJ1aWxkIHRoZSBjb3JyZXNwb25kaW5nICJwcm94eSIgYW5kICJ1dGlscyIgbGlicmFyaWVzIGluICRQVFBESVIvY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkgCi0gICBhbmQgJFBUUERJUi9jb3JlL29yZy5lY2xpcHNlLnB0cC51dGlscyBkaXJlY3RvcnkgdXNpbmcgJ2NvbmZpZ3VyZScsICdtYWtlJyBhbmQgJ21ha2UgaW5zdGFsbCcgY29tbWFuZHMuCi0KLQotNC4gVXNlICdjb25maWd1cmUnLCAnbWFrZScgYW5kICdtYWtlIGluc3RhbGwnIHdpdGhpbiB0aGlzIGRpcmVjdG9yeSBmcm9tCi0gICB0aGUgY29tbWFuZCBsaW5lIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBleGVjdXRhYmxlLgotICAgTk9URTogVGhlICdjb25maWd1cmUnIGNvbW1hbmQgTVVTVCByZXF1aXJlICctLXdpdGgtc2x1cm0nIG9wdGlvbiB0byBzcGVjaWZ5IHRoZQotICAgdG9wIGluc3RhbGwgZGlyZWN0b3J5IG9mIFNMVVJNLiBJZiBzdWNoIG9wdGlvbiBpcyBtaXNzZWQsIHRoZSBjb25maWd1cmUgcHJvY2VzcyB3aWxsIGZhaWwuCi0KLQotNS4gSWYgYW55IG9mIHRoZSBhdXRvbWFrZS9hdXRvY29uZiBmaWxlcyBjaGFuZ2VzLCB5b3Ugc2hvdWxkIGp1c3QgbmVlZCB0bwotICAgcnVuICdhdXRvcmVjb25mJyBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGZpbGVzLgotCi0KLQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9hYm91dC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjgxMDkzLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5NYXkgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9jb25maWcuaC5pbiBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzEzNGQuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9jb25maWcuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHByb3h5c3ZyJyBsaWJyYXJ5ICgtbHByb3h5c3ZyKS4gKi8KLSN1bmRlZiBIQVZFX0xJQlBST1hZU1ZSCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2x1cm0nIGxpYnJhcnkgKC1sc2x1cm0pLiAqLwotI3VuZGVmIEhBVkVfTElCU0xVUk0KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1dGlscycgbGlicmFyeSAoLWx1dGlscykuICovCi0jdW5kZWYgSEFWRV9MSUJVVElMUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX01FTU9SWV9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2x1cm0vc2x1cm1fZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TTFVSTV9TTFVSTV9FUlJOT19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2x1cm0vc2x1cm0uaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TTFVSTV9TTFVSTV9ICi0KLS8qIEVuYWJsZSBTTFVSTSBybXMgc3VwcG9ydC4gKi8KLSN1bmRlZiBIQVZFX1NSVU4KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TVERJTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9TWVNfU1RBVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9VTklTVERfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQgLWMgYW5kIC1vIHRvZ2V0aGVyLiAqLwotI3VuZGVmIE5PX01JTlVTX0NfTUlOVVNfTwotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX05BTUUKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KLQotLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGBpbnQnIG9yIGB2b2lkJykuICovCi0jdW5kZWYgUkVUU0lHVFlQRQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvY29uZmlndXJlLmluIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTU1MDYuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi1kbmwKLWRubAotCi1BQ19QUkVSRVEoWzIuNTBdKQotCi1BQ19JTklUKFtvcmcuZWNsaXBzZS5wdHAuc2x1cm1dLCBbMi4xXSkKLUFDX0NPTkZJR19TUkNESVIoW3NyYy9wdHBfc2x1cm1fcHJveHkuY10pCi0KLUFNX0lOSVRfQVVUT01BS0UoWy1XYWxsIC1XZXJyb3IgZm9yZWlnbl0pCi0KLUFDX0NBTk9OSUNBTF9CVUlMRAotCi1kbmwKLWRubCBFY2xpcHNlIGFkZHMgdmVyc2lvbiBudW1iZXIgdG8gZW5kIG9mIHBhY2thZ2Ugd2hlbiBkZXBsb3lpbmcgdmlhIHVwZGF0ZSBzaXRlCi1kbmwKLQotVVRJTFM9Ii4uLy4uL2NvcmUvb3JnLmVjbGlwc2UucHRwLnV0aWxzIgotaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCVVUSUxTPSJgZWNobyAke1VUSUxTfV8ke1BBQ0tBR0VfVkVSU0lPTn0uKmAiCi0JaWYgdGVzdCAhIC1kICRVVElMUzsgdGhlbgotCQlBQ19NU0dfRVJST1IoW3V0aWxzIGRpcmVjdG9yeSBub3QgZm91bmRdKQotCWZpCi1maQotCi1QUk9YWT0iLi4vLi4vY29yZS9vcmcuZWNsaXBzZS5wdHAucHJveHkiCi1pZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JUFJPWFk9ImBlY2hvICR7UFJPWFl9XyR7UEFDS0FHRV9WRVJTSU9OfS4qYCIKLQlpZiB0ZXN0ICEgLWQgJFBST1hZOyB0aGVuCi0JCUFDX01TR19FUlJPUihbcHJveHkgZGlyZWN0b3J5IG5vdCBmb3VuZF0pCi0JZmkKLWZpCi0KLWRubCBTTFVSTQotCi1BQ19BUkdfV0lUSChbc2x1cm1dLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXNsdXJtXSwKLQlbU3BlY2lmeSB0aGUgdG9wIGRpciBvZiBpbnN0YWxsZWQgU0xVUk0gcm1zLkA8OkBSRVFVSVJFREA6PkBdKSxbXSxbd2l0aF9zbHVybT1ub10pCi0KLVNMVVJNRElSPQotQVNfSUYoW3Rlc3QgIngkd2l0aF9zbHVybSIgIT0geG5vXSxbQUNfU1VCU1QoW1NMVVJNRElSXSxbJHdpdGhfc2x1cm1dKV0sCi0gICAgICAgQUNfTVNHX0VSUk9SKFtUaGUgdG9wIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgU0xVUk0gcm1zIG11c3QgYmUgc3BlY2lmaWVkIHZpYSAiLS13aXRoLXNsdXJtPURJUiIuXSkpCi0KLQotZG5sCi1kbmwgQ2hlY2sgZm9yIHByb2dyYW1zLgotZG5sCi0KLUFDX1BST0dfQ0MKLUFNX1BST0dfQ0NfQ19PCi1BQ19QUk9HX0lOU1RBTEwKLUFDX1BST0dfTUFLRV9TRVQKLUFDX1BST0dfUkFOTElCCi0KLUNGTEFHUz0iJENGTEFHUyAtV2FsbCAtSSRVVElMUy9pbmNsdWRlIC1JJFBST1hZL2luY2x1ZGUgLUkkU0xVUk1ESVIvaW5jbHVkZSIKLUxJQlM9IiRMSUJTIC1MJFVUSUxTIC1MJFBST1hZIC1MJFNMVVJNRElSL2xpYiIKLUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkU0xVUk1ESVIvaW5jbHVkZSIKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIGxpYnJhcmllcy4KLWRubAotCi1BQ19DSEVDS19MSUIoW3V0aWxzXSwgW2JpdHNldF9uZXddKQotQUNfQ0hFQ0tfTElCKFtwcm94eXN2cl0sIFtwcm94eV9zdnJfaW5pdF0pCi1BQ19DSEVDS19MSUIoW3NsdXJtXSxbc2x1cm1fcGluZ10sW10sCi0JCQlbQUNfTVNHX0VSUk9SKFtsaWJzbHVybS5zby8uYSBub3QgZm91bmQuIE1ha2Ugc3VyZSAtLXdpdGgtc2x1cm0gc3BlY2lmeSBjb3JyZWN0IGRpci5dKV0pCi0KLWRubAotZG5sIENoZWNrIGZvciBoZWFkZXIgZmlsZXMuCi1kbmwKLQotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoW3NsdXJtL3NsdXJtLmggc2x1cm0vc2x1cm1fZXJybm8uaF0sW10sCi0JCQkJW0FDX01TR19FUlJPUihbc2x1cm0uaCBvciBzbHVybV9lcnJuby5oIG5vdCBmb3VuZF0pXSkKLQotZG5sCi1kbmwgQ2hlY2sgZm9yIHR5cGVzCi1kbmwKLUFDX1RZUEVfU0lHTkFMCi0KLUFDX1BBVEhfUFJPRyhTUlVOLCBbc3J1bl0sIG5vKQotaWYgdGVzdCAiJGFjX2N2X3BhdGhfU1JVTiIgIT0gbm87IHRoZW4KLQlBQ19ERUZJTkUoW0hBVkVfU1JVTl0sWzFdLFtFbmFibGUgU0xVUk0gcm1zIHN1cHBvcnQuXSkKLWVsc2UKLQlBQ19NU0dfRVJST1IoW3NydW4gY29tbWFuZCBub3QgZm91bmQuIE1ha2Ugc3VyZSBTTFVSTSBybXMgaW5zdGFsbGVkLl0pCi1maQotCi0KLUFDX0NPTkZJR19IRUFERVJTKFtjb25maWcuaF0pCi1BQ19DT05GSUdfRklMRVMoW01ha2VmaWxlXSkKLUFDX09VVFBVVApkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9saWJwcm94eS5wYXRjaCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvbGlicHJveHkucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjBhNDUuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9saWJwcm94eS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWRpZmYgLXVOciBvcmcuZWNsaXBzZS5wdHAucHJveHkvaW5jbHVkZS9wcm94eV9hdHRyLmggb3JnLmVjbGlwc2UucHRwLnByb3h5X3NsdXJtL2luY2x1ZGUvcHJveHlfYXR0ci5oCi0tLS0gb3JnLmVjbGlwc2UucHRwLnByb3h5L2luY2x1ZGUvcHJveHlfYXR0ci5oCTIwMDktMDQtMTQgMTU6MDg6MjkuMDAwMDAwMDAwICswODAwCi0rKysgb3JnLmVjbGlwc2UucHRwLnByb3h5X3NsdXJtL2luY2x1ZGUvcHJveHlfYXR0ci5oCTIwMDktMDQtMTQgMTU6MTI6NDAuMDAwMDAwMDAwICswODAwCi1AQCAtNTYsMTAgKzU2LDEyIEBACi0gICogTm9kZSBhdHRyaWJ1dGVzCi0gICovCi0gI2RlZmluZSBOT0RFX1NUQVRFX0FUVFIJCQkJIm5vZGVTdGF0ZSIKLSsjaWZuZGVmIEhBVkVfU0xVUk1fU0xVUk1fSAotICNkZWZpbmUgCU5PREVfU1RBVEVfVVAJCQkJIlVQIgotICNkZWZpbmUgCU5PREVfU1RBVEVfRE9XTgkJCQkiRE9XTiIKLSAjZGVmaW5lIAlOT0RFX1NUQVRFX0VSUk9SCQkJIkVSUk9SIgotICNkZWZpbmUgCU5PREVfU1RBVEVfVU5LTk9XTgkJCSJVTktOT1dOIgotKyNlbmRpZgotICNkZWZpbmUgTk9ERV9OVU1CRVJfQVRUUgkJCSJub2RlTnVtYmVyIgotICNpZmRlZiBIQVZFX1NZU19CUFJPQ19ICi0gI2RlZmluZSBOT0RFX0dST1VQX0FUVFIJCQkJIm5vZGVHcm91cCIKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0ucHJveHkvc3JjL3B0cF9zbHVybV9wcm94eS5jIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9zcmMvcHRwX3NsdXJtX3Byb3h5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODI4ODguLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5wcm94eS9zcmMvcHRwX3NsdXJtX3Byb3h5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmEKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAkJSmllIEppYW5nIDxqaWFuZ2ppZUBudWR0LmVkdS5jbj4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU0xVUk1fUFJPWFkKLSNkZWZpbmUgU0xVUk1fUFJPWFkgCi0jZW5kaWYgCi0KLQotI2lmZGVmIF9fZ251X2xpbnV4X18KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNlbmRpZiAvKiBfX2dudV9saW51eF9fICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGdycC5oPgotI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+ICAgICAgIAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9pcGMuaD4KLSNpbmNsdWRlIDxzeXMvc2htLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSAicHJveHkuaCIKLSNpbmNsdWRlICJwcm94eV90Y3AuaCIKLSNpbmNsdWRlICJoYW5kbGVyLmgiCi0jaW5jbHVkZSAibGlzdC5oIgotI2luY2x1ZGUgImFyZ3MuaCIKLSNpbmNsdWRlICJyYW5nZXNldC5oIgotI2luY2x1ZGUgInNsdXJtL3NsdXJtLmgiCi0jaW5jbHVkZSAic3J1bl9vcHQuaCIKLQotCi0jZGVmaW5lIFBUUF9KT0JJRCAJCQkwCi0jZGVmaW5lIFNMVVJNX0pPQklEIAkJMQotI2RlZmluZSBERUJVR19KT0JJRCAJCTIKLSNkZWZpbmUgSk9CSURfSU5JVCAJCQkwCi0jZGVmaW5lIEpPQklEX0ZBSUwgCQkJLTEKLSNkZWZpbmUgTUFYX1RIUkVBRFMgCQk2MAotI2RlZmluZSBDT1JFX0lOVkFMSUQgICAJCS0xCi0jZGVmaW5lIENPUkVfREVGQVVMVCAJCTAKLSNkZWZpbmUgTUFYX0JVRl9TSVpFIAkJODE5MiAKLSNkZWZpbmUgTUFYX1NSVU5fQVJHX05VTSAJMjU2Ci0jZGVmaW5lIEFMTF9KT0JTVEFURQkJLTEKLS8qCi0gKiBOZWVkIHRvIHVuZGVmIHRoZXNlIGlmIHdlIGluY2x1ZGUKLSAqIHR3byBjb25maWcuaCBmaWxlcwotICovCi0jdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKLSN1bmRlZiBQQUNLQUdFX05BTUUKLSN1bmRlZiBQQUNLQUdFX1NUUklORwotI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQotI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgotCi0jZGVmaW5lIFdJUkVfUFJPVE9DT0xfVkVSU0lPTgkiMi4wIgotI2RlZmluZSBERUZBVUxUX0hPU1QJCQkibG9jYWxob3N0IgotI2RlZmluZSBERUZBVUxUX1BST1hZCQkJInRjcCIKLQotLyoKLSAqIFByb3h5IHNlcnZlciBzdGF0ZXMuIFRoZSBTSFVUVElOR19ET1dOIHN0YXRlIGlzIHVzZWQgdG8KLSAqIGdpdmUgdGhlIHByb3h5IGEgY2hhbmNlIHRvIHNlbmQgYW55IHBlbmRpbmcgZXZlbnRzIG9uY2UKLSAqIGEgUVVJVCBjb21tYW5kIGhhcyBiZWVuIHJlY2VpdmVkLgotICovCi0jZGVmaW5lIFNUQVRFX0lOSVQJCQkwCi0jZGVmaW5lIFNUQVRFX1JVTk5JTkcJCTEKLSNkZWZpbmUgU1RBVEVfU0hVVFRJTkdfRE9XTgkyCi0jZGVmaW5lIFNUQVRFX1NIVVRET1dOCQkzCi0KLQotLyoKLSAqIFJURVYgY29kZXMgbXVzdCBFWEFDVExZIG1hdGNoIG9yZy5lY2xpcHNlLnB0cC5ydHN5c3RlbS5wcm94eS5ldmVudC5JUHJveHlSdW50aW1lRXZlbnQKLSAqLwotI2RlZmluZSBSVEVWX09GRlNFVAkJCQkJCTIwMAotI2RlZmluZSBSVEVWX0VSUk9SX1NMVVJNX0lOSVQJCQlSVEVWX09GRlNFVCArIDEwMDAKLSNkZWZpbmUgUlRFVl9FUlJPUl9TTFVSTV9GSU5BTElaRQkJUlRFVl9PRkZTRVQgKyAxMDAxCi0jZGVmaW5lIFJURVZfRVJST1JfU0xVUk1fU1VCTUlUCQkJUlRFVl9PRkZTRVQgKyAxMDAyCi0jZGVmaW5lIFJURVZfRVJST1JfSk9CCQkJCQlSVEVWX09GRlNFVCArIDEwMDMKLSNkZWZpbmUgUlRFVl9FUlJPUl9OQVRUUgkJCQlSVEVWX09GRlNFVCArIDEwMDcKLS8vI2RlZmluZSBSVEVWX0VSUk9SX09SVEVfQlBST0NfU1VCU0NSSUJFCVJURVZfT0ZGU0VUICsgMTAwOAotI2RlZmluZSBSVEVWX0VSUk9SX1NJR05BTAkJCQlSVEVWX09GRlNFVCArIDEwMDkKLQotLyoKLSAqIFF1ZXVlIGF0dHJpYnV0ZXMKLSAqLwotI2RlZmluZSBERUZBVUxUX1FVRVVFX05BTUUJCQkiZGVmYXVsdCIKLSNkZWZpbmUgU0xVUk1fSk9CX05BTUVfRk1UCQkJImpvYiUwMmQiCi0KLSNkZWZpbmUgTUFYX1JFVFJJRVMgCQkJCTEwMAotI2RlZmluZSBKT0JfVVBEQVRFX1RJTUVSIAkJCTEKLSNkZWZpbmUgTk9ERV9VUERBVEVfVElNRVIgCQkJMgotI2RlZmluZSBKT0JfVVBEQVRFX1RJTUVPVVQJCQk1MDAwMDAgCS8qdXNlYyovCi0jZGVmaW5lIE5PREVfVVBEQVRFX1RJTUVPVVQJCQk1MDAwMDAwIC8qdXNlYyovCi0KLS8qIFNMVVJNIGpvYiBzdGF0ZSBhbmQgYXR0cmlidXRlcyAqLwotI2RlZmluZQlTTFVSTV9KT0JfU1RBVEVfUEVORElORwkJCSJQRU5ESU5HIgotI2RlZmluZQlTTFVSTV9KT0JfU1RBVEVfUlVOTklORwkJCSJSVU5OSU5HIgotI2RlZmluZQlTTFVSTV9KT0JfU1RBVEVfU1VTUEVOREVECQkiU1VTUEVOREVEIgotI2RlZmluZSBTTFVSTV9KT0JfU1RBVEVfVEVSTUlOQVRFRAkJIlRFUk1JTkFURUQiCi0jZGVmaW5lCVNMVVJNX0pPQl9TVEFURV9DT01QTEVURQkJU0xVUk1fSk9CX1NUQVRFX1RFUk1JTkFURUQKLSNkZWZpbmUgU0xVUk1fSk9CX1NUQVRFX0NBTkNFTExFRAkJIkNBTkNFTExFRCIKLSNkZWZpbmUJU0xVUk1fSk9CX1NUQVRFX0ZBSUxFRAkJICAJIkZBSUxFRCIKLSNkZWZpbmUJU0xVUk1fSk9CX1NUQVRFX1RJTUVPVVQJCSAgCSJUSU1FT1VUIgotI2RlZmluZQlTTFVSTV9KT0JfU1RBVEVfTk9ERUZBSUwJCSJOT0RFRkFJTCIKLQotI2RlZmluZSBTTFVSTV9KT0JfU1VCX0lEX0FUVFIJCQkJImpvYlN1YklkIgotI2RlZmluZSBTTFVSTV9KT0JfTlVNX1BST0NTX0FUVFIJCQkiam9iTnVtUHJvY3MiIAkvLy1uCi0jZGVmaW5lIFNMVVJNX0pPQl9OVU1fTk9ERVNfQVRUUgkJCSJqb2JOdW1Ob2RlcyIgCS8vLU4KLSNkZWZpbmUgU0xVUk1fSk9CX1RJTUVfTElNSVRfQVRUUgkJCSJqb2JUaW1lTGltaXQiCS8vLXQKLSNkZWZpbmUgU0xVUk1fSk9CX1BBUlRJVElPTl9BVFRSCQkJImpvYlBhcnRpdGlvbiIgCS8vLXAKLSNkZWZpbmUgU0xVUk1fSk9CX0lEX0FUVFIJCQkJCSJqb2JJZCIgICAgICAgIAkvLy0tam9iaWQKLSNkZWZpbmUgU0xVUk1fSk9CX05PREVMSVNUX0FUVFIJCQkJImpvYk5vZGVMaXN0IiAgCS8vLXcKLSNkZWZpbmUgU0xVUk1fSk9CX1RZUEVfQVRUUgkJCQkJImpvYlR5cGUiICAgICAgCS8vLS1qb2J0eXBlCi0jZGVmaW5lIFNMVVJNX0pPQl9JT0xBQkVMX0FUVFIJCQkJImpvYklvTGFiZWwiICAgCS8vLWwKLSNkZWZpbmUgU0xVUk1fSk9CX1ZFUkJPU0VfQVRUUgkJCQkiam9iVmVyYm9zZSIgICAJLy8tdgotI2RlZmluZSBTTFVSTV9KT0JfRVhFQ19OQU1FX0FUVFIJCQkiZXhlY05hbWUiCi0jZGVmaW5lIFNMVVJNX0pPQl9FWEVDX1BBVEhfQVRUUgkJCSJleGVjUGF0aCIKLSNkZWZpbmUgU0xVUk1fSk9CX1dPUktJTkdfRElSX0FUVFIJCQkid29ya2luZ0RpciIKLSNkZWZpbmUgU0xVUk1fSk9CX1BST0dfQVJHU19BVFRSCQkJInByb2dBcmdzIgotI2RlZmluZSBTTFVSTV9KT0JfRU5WX0FUVFIJCQkJCSJlbnYiCi0jZGVmaW5lIFNMVVJNX0pPQl9ERUJVR19FWEVDX05BTUVfQVRUUgkJImRlYnVnRXhlY05hbWUiCi0jZGVmaW5lIFNMVVJNX0pPQl9ERUJVR19FWEVDX1BBVEhfQVRUUgkJImRlYnVnRXhlY1BhdGgiCi0jZGVmaW5lIFNMVVJNX0pPQl9ERUJVR19BUkdTX0FUVFIJCQkiZGVidWdBcmdzIgotI2RlZmluZSBTTFVSTV9KT0JfREVCVUdfRkxBR19BVFRSCQkJImRlYnVnIgotCi0vKiBTTFVSTSBub2RlIHN0YXRlIGFuZCBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIFNMVVJNX05PREVfU1RBVEVfVU5LTk9XTgkJIlVOS05PV04iCi0jZGVmaW5lIFNMVVJNX05PREVfU1RBVEVfRE9XTgkJCSJET1dOIgotI2RlZmluZSBTTFVSTV9OT0RFX1NUQVRFX0lETEUJCQkiVVAiCi0jZGVmaW5lCVNMVVJNX05PREVfU1RBVEVfQUxMT0NBVEVECQkiQUxMT0NBVEVEIgotI2RlZmluZSBTTFVSTV9OT0RFX0VYVFJBX1NUQVRFX0FUVFIJCSJub2RlRXh0cmFTdGF0ZSIKLSNkZWZpbmUgU0xVUk1fTk9ERV9OVU1CRVJfQVRUUgkJCSJub2RlTnVtYmVyIgotI2RlZmluZSBTTFVSTV9OT0RFX1NPQ0tFVFNfQVRUUgkJCSJzb2NrTnVtYmVyIgotI2RlZmluZSBTTFVSTV9OT0RFX0NPUkVTX0FUVFIJCQkiY29yZU51bWJlciIKLSNkZWZpbmUgU0xVUk1fTk9ERV9USFJFQURTX0FUVFIJCQkidGhyZWFkTnVtYmVyIgotI2RlZmluZSBTTFVSTV9OT0RFX0FSQ0hfQVRUUgkJCSJjcHVBcmNoIgotI2RlZmluZSBTTFVSTV9OT0RFX09TX0FUVFIJCQkJIk9TIgotCi0jZGVmaW5lIEVYSVRfSk9CX0FMTE9DX0ZBSUwJCS0xCi0jZGVmaW5lIEVYSVRfSk9CX0lPVEhSRUFEX0ZBSUwJLTIKLSNkZWZpbmUgRVhJVF9FWEVDX0ZBSUwJCQktMwotCi0KLXN0cnVjdCBzeW5jX21zZyB7Ci0JaW50CQlzbHVybV9qb2JpZDsKLQlib29sIAlqb2JpZF9zZXQ7Ci0JYm9vbAlpb19yZWFkeTsKLX07Ci10eXBlZGVmIHN0cnVjdCBzeW5jX21zZyBzeW5jX21zZzsKLQotc3RydWN0IHB0cF9tYWNoaW5lIHsKLQlpbnQJCWlkOwotCUxpc3QgKglub2RlczsKLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfbWFjaGluZQlwdHBfbWFjaGluZTsKLQotc3RydWN0IHB0cF9zbHVybV9ub2RlIHsKLQlpbnQgCQlpZDsgIAkvKiBtb2RlbCBlbGVtZW50IGlkLCBnZW5lcmF0ZWQgYnkgcHJveHkgYWdlbnQgKi8KLQlpbnQJCQludW1iZXI7CS8qIG5vZGUgbnVtYmVyLCBhc3NpZ25lZCBieSBTTFVSTSAqLwotCWNoYXIgKgkJbmFtZTsKLQl1aW50MTZfdAlzdGF0ZTsgCS8qICh1aW50MTZfdClub2RlX2luZm9fdC5zdGF0ZSwgY29udmVydGVkIHRvIChjaGFyICopICAqLwotCXVpbnQxNl90IAlzb2NrZXRzOwotCXVpbnQxNl90IAljb3JlczsKLQl1aW50MTZfdCAJdGhyZWFkczsKLQljaGFyICoJCWFyY2g7Ci0JY2hhciAqCQlvczsKLX07Ci10eXBlZGVmIHN0cnVjdCBwdHBfc2x1cm1fbm9kZQlwdHBfbm9kZTsKLQotc3RydWN0IHB0cF9zbHVybV9wcm9jZXNzIHsKLQlpbnQJCWlkOwotCWludAkJbm9kZV9pZDsKLQlpbnQJCXRhc2tfaWQ7IC8qIE1QSSByYW5rICovCi0JaW50CQlwaWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcHRwX3NsdXJtX3Byb2Nlc3MJcHRwX3Byb2Nlc3M7Ci0KLXN0cnVjdCBwdHBfc2x1cm1fam9iIHsKLQlpbnQgCQkJCXB0cF9qb2JpZDsJCS8qIGpvYiBJRCBhcyBrbm93biBieSBQVFAgKi8KLQlpbnQgCQkJCXNsdXJtX2pvYmlkOwkvKiBqb2IgSUQgdGhhdCB3aWxsIGJlIHVzZWQgYnkgcHJvZ3JhbSB3aGVuIGl0IHN0YXJ0cyAqLwotCWJvb2wJCQkJbmVlZF9hbGxvYzsJCS8qIG5lZWQgdG8gYWxsb2NhdGUgbmV3IHJlc291cmNlICovCi0JaW50CQkJCQlkZWJ1Z19qb2JpZDsKLQlpbnQJCQkJCW51bV9wcm9jczsJCS8qIG51bWJlciBvZiBwcm9jcyByZXF1ZXN0ZWQgZm9yIHByb2dyYW0gKGRlYnVnZ2VyOiBudW1fcHJvY3MrMSkgKi8KLQlpbnQJCQkJCXN0YXRlOwkJCS8qIGpvYiBzdGF0ZShzbHVybSBkZWZpbml0aW9uKSAqLwotCXBpZF90CQkJCXNydW5fcGlkOwkJLyogcGlkIG9mIHRoZSBzcnVuIHByb2Nlc3MgKi8KLQlib29sCQkJCWRlYnVnOwkJCS8qIGpvYiBpcyBkZWJ1ZyBqb2IgKi8KLQlib29sIAkJCQlhdHRhY2g7CQkJLyogYXR0YWNoIGRlYnVnICovCi0JaW50CQkJCQlmZF9lcnI7CQkJLyogZmQgb2YgcGlwZSBmb3Igc3J1bidzIHN0ZGVyciAqLwotCWludAkJCQkJZmRfb3V0OwkJCS8qIGZkIG9mIHBpcGUgZm9yIHNydW4ncyBzdGRvdXQgKi8KLQlpbnQJCQkJCWlvdGhyZWFkX2lkOwkvKiBpZCBvZiB0aHJlYWQgZm9yd2FyZGluZyBzcnVuJ3Mgc3RkaW8gKi8KLQlib29sCQkJCWlvdGhyZWFkX2V4aXRfcmVxOyAvKiByZXF1ZXN0IGlvdGhyZWFkIHRvIGV4aXQgKi8KLQlib29sCQkJCWlvdGhyZWFkX2V4aXQ7ICAvKiBmbGFnIGluaWRpY2F0aW9uIGlvdGhyZWFkIGhhcyBleGl0ZWQgICovCi0JYm9vbAkJCQlyZW1vdmFibGU7Ci0JcHRwX3Byb2Nlc3MgKiogIAlwcm9jczsJCQkvKiBwcm9jcyBvZiB0aGlzIGpvYiAqLwotCXJhbmdlc2V0ICogCQkJc2V0OwkJCS8qIHJhbmdlIHNldCBvZiBwcm9jIElEICovCi19OwotdHlwZWRlZiBzdHJ1Y3QgcHRwX3NsdXJtX2pvYiBwdHBfam9iOwotCi10eXBlZGVmIHN0cnVjdCBzbHVybWN0bGRfY29tbV9hZGRyIHsKLQljaGFyICogaG9zdG5hbWU7Ci0JdWludDE2X3QgcG9ydDsKLX1zbHVybWN0bGRfY29tbV9hZGRyX3Q7Ci0KLXR5cGVkZWYgdm9pZCBTaWdGdW5jKGludCk7Ci10eXBlZGVmIGludDMyX3Qgc2x1cm1fZmQ7Ci0KLQotc3RhdGljIGludCBTTFVSTV9Jbml0aWFsaXplKGludCwgaW50LCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgU0xVUk1fTW9kZWxEZWYoaW50LCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBTTFVSTV9TdGFydEV2ZW50cyhpbnQsIGludCwgY2hhciAqKik7Ci1zdGF0aWMgaW50IFNMVVJNX1N0b3BFdmVudHMoaW50LCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBTTFVSTV9TdWJtaXRKb2IoaW50LCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBTTFVSTV9UZXJtaW5hdGVKb2IoaW50LCBpbnQsIGNoYXIgKiopOwotc3RhdGljIGludCBTTFVSTV9RdWl0KGludCwgaW50LCBjaGFyICoqKTsKLQotc3RhdGljIEZJTEUgKiBpbml0X2xvZ2ZwKCk7Ci1zdGF0aWMgdm9pZCBkZWJ1Z19sb2coRklMRSAqIGZwLCBjaGFyICogZm10LC4uLik7Ci1zdGF0aWMgdm9pZCAqIHNydW5fb3V0cHV0X2ZvcndhcmRpbmcodm9pZCAqIGFyZyk7Ci1zdGF0aWMgYm9vbCBqb2JfdXBkYXRlX3RpbWVvdXQoKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9qb2Jfc3RhdGUoaW50IHNsdXJtX2pvYmlkKTsKLXN0YXRpYyBib29sIG5vZGVfdXBkYXRlX3RpbWVvdXQoKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9ub2RlX3N0YXRlKCk7Ci1zdGF0aWMgaW50IGNyZWF0ZV9ub2RlX2xpc3QocHRwX21hY2hpbmUgKm1hY2gpOwotc3RhdGljIHZvaWQgaW5pdF9qb2JfdGltZXIoKTsKLXN0YXRpYyB2b2lkIGluaXRfbm9kZV90aW1lcigpOwotCi1zdGF0aWMgc3RydWN0IHRpbWV2YWwgCQlqb2JfdXBkYXRlX3RpbWVyOwotc3RhdGljIHN0cnVjdCB0aW1ldmFsCQlub2RlX3VwZGF0ZV90aW1lcjsKLXN0YXRpYyBzeW5jX21zZyAqCQkJc3luY19tc2dfYWRkcjsKLXN0YXRpYyBGSUxFICogCQkJCWxvZ2ZwOwotc3RhdGljIGludCAJCQkJCWRlc3Ryb3lfam9iID0gMDsgLyogam9iIGFsbG9jYXRpb24gY2FuY2VsbGVkIGJ5IHNpZ25hbCAqLwotc3RhdGljIGJvb2wgCQkJCWVuYWJsZV9zdGF0ZV91cGRhdGUgPSBmYWxzZTsKLXN0YXRpYyAJc3J1bl9vcHRfdAkJCW9wdDsKLXN0YXRpYyBhbGxvY2F0aW9uX21zZ190aHJlYWRfdCogbXNnX3RociA9IE5VTEw7Ci1zdGF0aWMgc2x1cm1jdGxkX2NvbW1fYWRkcl90IHNsdXJtY3RsZF9jb21tX2FkZHI7Ci1zdGF0aWMgaW50CQkJZ1RyYW5zSUQgPSAwOyAvKiB0cmFuc2FjdGlvbiBpZCBmb3Igc3RhcnQgb2YgZXZlbnQgc3RyZWFtLCBpcyAwIHdoZW4gZXZlbnRzIGFyZSBvZmYgKi8KLXN0YXRpYyBpbnQJCQlnQmFzZUlEID0gLTE7IC8qIGJhc2UgSUQgZm9yIGV2ZW50IGdlbmVyYXRpb24gKi8KLXN0YXRpYyBpbnQJCQlnTGFzdElEID0gMTsgIC8qIElEIGdlbmVyYXRvciAqLwotc3RhdGljIGludAkJCWdRdWV1ZUlEOyAgICAgLyogSUQgb2YgZGVmYXVsdCBxdWV1ZSAqLwotc3RhdGljIGludCAJCQlwcm94eV9zdGF0ZSA9IFNUQVRFX0lOSVQ7Ci1zdGF0aWMgcHJveHlfc3ZyICoJc2x1cm1fcHJveHk7Ci1zdGF0aWMgTGlzdCAqCQlnSm9iTGlzdDsKLXN0YXRpYyBMaXN0ICoJCWdNYWNoaW5lTGlzdDsKLXN0YXRpYyBpbnQJCQlwdHBfc2lnbmFsX2V4aXQgPSAwOzsKLQotCi1zdGF0aWMgcHJveHlfc3ZyX2hlbHBlcl9mdW5jcyBoZWxwZXJfZnVuY3MgPSB7Ci0JTlVMTCwJCQkJCS8vIG5ld2Nvbm4oKSAtIGNhbiBiZSB1c2VkIHRvIHJlamVjdCBjb25uZWN0aW9ucwotCU5VTEwJCQkJCS8vIG51bXNlcnZlcnMoKSAtIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2ZXJzLCByZXR1cm4gdGhlIG51bWJlcgotfTsKLQotI2RlZmluZSBDTURfQkFTRQkwCi1zdGF0aWMgcHJveHlfY21kCWNtZHNbXSA9IHsKLQlTTFVSTV9RdWl0LAotCVNMVVJNX0luaXRpYWxpemUsCi0JU0xVUk1fTW9kZWxEZWYsCi0JU0xVUk1fU3RhcnRFdmVudHMsCi0JU0xVUk1fU3RvcEV2ZW50cywKLQlTTFVSTV9TdWJtaXRKb2IsCi0JU0xVUk1fVGVybWluYXRlSm9iCi19OwotCi1zdGF0aWMgcHJveHlfY29tbWFuZHMgY29tbWFuZF90YWIgPSB7Ci0JQ01EX0JBU0UsCi0Jc2l6ZW9mKGNtZHMpL3NpemVvZihwcm94eV9jbWQpLAotCWNtZHMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0JeyJwcm94eSIsCQkJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsIAknUCd9LCAKLQl7InBvcnQiLAkJCXJlcXVpcmVkX2FyZ3VtZW50LAlOVUxMLCAJJ3AnfSwgCi0JeyJob3N0IiwJCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwgCSdoJ30sIAotCXtOVUxMLAkJCQkwLAkJCQkJTlVMTCwJMH0KLX07Ci0KLQotLyogCi0gKiBJZiB0aGUgbG9nIGZpbGUgaXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIEZJTEUgcG9pbnRlci4KLSAqIE90aGVyd2lzZSwgZGVmYXVsdCB0byBzdGRlcnIuCi0gKi8KLXN0YXRpYyBGSUxFICogCi1pbml0X2xvZ2ZwKCkKLXsKLQlGSUxFICogZnAgPSBzdGRlcnI7Ci0JY2hhciAqIGxvZ2RpcjsKLQljaGFyICogbG9nZmlsZTsKLQlpbnQgICAgcmM7Ci0JCi0JaWYgKChsb2dkaXIgPSBnZXRlbnYoIlBUUF9TTFVSTV9QUk9YWV9MT0dESVIiKSkgPT0gTlVMTCkKLQkJcmV0dXJuIGZwOwotCQotCXJjID0gYWNjZXNzKGxvZ2RpciwgUl9PS3xXX09LKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUGxlYXNlIGVuc3VyZSB0aGUgRElSICVzIGV4aXN0cyBhbmQgeW91IGNhbiBSRUFEL1dSSVRFIGl0IVxuIiwgbG9nZGlyKTsKLQkJcmV0dXJuIGZwOwotCX0KLQlhc3ByaW50ZigmbG9nZmlsZSwiJXMvcHRwX3Byb3h5LmxvZyIsbG9nZGlyKTsKLQlmcCA9IGZvcGVuKGxvZ2ZpbGUsIncrIik7Ci0JaWYoZnAgPT0gTlVMTCkgCi0JCWZwID0gc3RkZXJyOwotCWZyZWUobG9nZmlsZSk7Ci0KLQlyZXR1cm4gZnA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBkZWJ1ZyBpbmZvIGludG8gbG9nZmlsZS4KLSAqLwotc3RhdGljIHZvaWQKLWRlYnVnX2xvZyhGSUxFICogZnAsIGNoYXIgKiBmbXQsLi4uKQotewotCXZhX2xpc3QgdmE7Ci0KLQlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JdmFfc3RhcnQodmEsIGZtdCk7Ci0JdmZwcmludGYoZnAsIGZtdCwgdmEpOwotCWZmbHVzaChmcCk7Ci0JdmFfZW5kKHZhKTsKLQotCXJldHVybjsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIGEgbW9kZWwgZWxlbWVudCBJRC4KLSAqLwotc3RhdGljIGludAotZ2VuZXJhdGVfaWQodm9pZCkKLXsKLQlyZXR1cm4gZ0Jhc2VJRCArIGdMYXN0SUQrKzsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBtYWNoaW5lLgotICovCi1zdGF0aWMgcHRwX21hY2hpbmUgKgotbmV3X21hY2hpbmUoKQotewotCXB0cF9tYWNoaW5lICoJbSA9IChwdHBfbWFjaGluZSAqKW1hbGxvYyhzaXplb2YocHRwX21hY2hpbmUpKTsKLQltLT5pZCA9IGdlbmVyYXRlX2lkKCk7Ci0JbS0+bm9kZXMgPSBOZXdMaXN0KCk7Ci0gICAgQWRkVG9MaXN0KGdNYWNoaW5lTGlzdCwgKHZvaWQgKiltKTsKLQotICAgIHJldHVybiBtOwotfQotCi0vKgotICogQ29udmVydCBTTFVSTSBub2RlIHN0YXRlIGNvZGUgKHVpbnQxNl90KSB0byBTVFJJTkcuCi0gKi8KLXN0YXRpYyBjaGFyICogCi1ub2Rlc3RhdGVfdG9fc3RyaW5nKHVpbnQxNl90IHNsdXJtX25vZGVfc3RhdGUpCi17Ci0JY2hhciAqIHN0ciA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHNsdXJtX25vZGVfc3RhdGUgJiBOT0RFX1NUQVRFX0JBU0UpIHsKLQkJY2FzZSBOT0RFX1NUQVRFX1VOS05PV046Ci0JCQlzdHIgPSAgU0xVUk1fTk9ERV9TVEFURV9VTktOT1dOOwotCQkJYnJlYWs7Ci0JCWNhc2UgIE5PREVfU1RBVEVfRE9XTjoKLQkJCXN0ciA9ICBTTFVSTV9OT0RFX1NUQVRFX0RPV047Ci0JCQlicmVhazsKLQkJY2FzZSAgTk9ERV9TVEFURV9JRExFOgotCQkJc3RyID0gIFNMVVJNX05PREVfU1RBVEVfSURMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5PREVfU1RBVEVfQUxMT0NBVEVEOgotCQkJc3RyID0gIFNMVVJNX05PREVfU1RBVEVfQUxMT0NBVEVEOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzdHIgPSBTTFVSTV9OT0RFX1NUQVRFX1VOS05PV047Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc3RyOwotfQotCi0vKgotICogQ29udmVydCBTTFVSTSBqb2Igc3RhdGUgY29kZSh1aW50MTZfdCkgdG8gU1RSSU5HLgotICovCi1zdGF0aWMgY2hhciAqCi1qb2JzdGF0ZV90b19zdHJpbmcodWludDE2X3Qgc2x1cm1fam9iX3N0YXRlKQotewotCWNoYXIgKiBzdHIgPSBOVUxMOwotCi0Jc3dpdGNoIChzbHVybV9qb2Jfc3RhdGUgJiAofkpPQl9DT01QTEVUSU5HKSkgewotCQljYXNlIEpPQl9QRU5ESU5HOgotCQkJc3RyID0gU0xVUk1fSk9CX1NUQVRFX1BFTkRJTkc7IAotCQkJYnJlYWs7Ci0JCWNhc2UgSk9CX1JVTk5JTkc6Ci0JCQlzdHIgPSBTTFVSTV9KT0JfU1RBVEVfUlVOTklORzsKLQkJCWJyZWFrOwotCQljYXNlIEpPQl9TVVNQRU5ERUQ6Ci0JCQlzdHIgPSBTTFVSTV9KT0JfU1RBVEVfU1VTUEVOREVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgSk9CX0NPTVBMRVRFOgotCQkJc3RyID0gU0xVUk1fSk9CX1NUQVRFX0NPTVBMRVRFOyAKLQkJCWJyZWFrOwotCQljYXNlIEpPQl9DQU5DRUxMRUQ6Ci0JCQlzdHIgPSBTTFVSTV9KT0JfU1RBVEVfQ0FOQ0VMTEVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgSk9CX0ZBSUxFRDoKLQkJCXN0ciA9IFNMVVJNX0pPQl9TVEFURV9GQUlMRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBKT0JfVElNRU9VVDoKLQkJCXN0ciA9IFNMVVJNX0pPQl9TVEFURV9USU1FT1VUOwotCQkJYnJlYWs7Ci0JCWNhc2UgSk9CX05PREVfRkFJTDoKLQkJCXN0ciA9IFNMVVJNX0pPQl9TVEFURV9OT0RFRkFJTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3RyID0gIlVua25vd24gam9iIHN0YXRlIjsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBzdHI7Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBub2RlIGFuZCBpbnNlcnQgaXQgaW50byBtYWNoaW5lIG5vZGUgbGlzdC4KLSAqLwotc3RhdGljIHB0cF9ub2RlICoKLW5ld19ub2RlKHB0cF9tYWNoaW5lICptYWNoLCBub2RlX2luZm9fdCAqbmkpCi17Ci0Jc3RhdGljIGludCBub2RlX251bWJlciA9IDA7Ci0JcHRwX25vZGUgKiBuID0gKHB0cF9ub2RlICopbWFsbG9jKHNpemVvZihwdHBfbm9kZSkpOwotCQotCW1lbXNldCgoY2hhciAqKW4sIDAsIHNpemVvZihwdHBfbm9kZSkpOwotCW4tPmlkID0gZ2VuZXJhdGVfaWQoKTsKLQluLT5udW1iZXIgPSBub2RlX251bWJlcisrOwotCi0Jbi0+c29ja2V0cyA9IG5pLT5zb2NrZXRzOwotCW4tPmNvcmVzID0gbmktPmNvcmVzOwotCW4tPnRocmVhZHMgPSBuaS0+dGhyZWFkczsKLQotCWlmIChuaS0+bmFtZSAhPSBOVUxMKQotCQluLT5uYW1lID0gc3RyZHVwKG5pLT5uYW1lKTsKLQkKLQluLT5zdGF0ZSA9IG5pLT5ub2RlX3N0YXRlOwotCQkKLQlpZiAobmktPmFyY2ggIT0gTlVMTCkKLQkJbi0+YXJjaCA9IHN0cmR1cChuaS0+YXJjaCk7Ci0JaWYgKG5pLT5vcyAhPSBOVUxMKQotCQluLT5vcyA9IHN0cmR1cChuaS0+b3MpOwotCQotICAgIEFkZFRvTGlzdChtYWNoLT5ub2RlcywgKHZvaWQgKiluKTsKLQotICAgIHJldHVybiBuOwotfQotCi0vKgotICogR2V0IG5vZGUgcG9pbnRlciBmcm9tIG5vZGUgbmFtZS4gCi0gKi8KLXN0YXRpYyBwdHBfbm9kZSAqCi1maW5kX25vZGVfYnlfbmFtZShjaGFyICpuYW1lKQotewotCXB0cF9tYWNoaW5lICoJbTsKLQlwdHBfbm9kZSAqCQluOwotCQotCWZvciAoU2V0TGlzdChnTWFjaGluZUxpc3QpOyAobSA9IChwdHBfbWFjaGluZSAqKUdldExpc3RFbGVtZW50KGdNYWNoaW5lTGlzdCkpICE9IE5VTEw7ICkgewotCQlmb3IgKFNldExpc3QobS0+bm9kZXMpOyAobiA9IChwdHBfbm9kZSAqKUdldExpc3RFbGVtZW50KG0tPm5vZGVzKSkgIT0gTlVMTDsgKSB7Ci0JCQlpZiAoc3RyY21wKG5hbWUsIG4tPm5hbWUpID09IDApCi0JCQkJcmV0dXJuIG47Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBuZXcgcHJvY2VzcyBhbmQgaW5zZXJ0IGl0IGludG8gam9iIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIHB0cF9wcm9jZXNzICoKLW5ld19wcm9jZXNzKHB0cF9qb2IgKmpvYiwgaW50IG5vZGVfaWQsIGludCB0YXNrX2lkLCBpbnQgcGlkKQotewotCXB0cF9wcm9jZXNzICoJcCA9IChwdHBfcHJvY2VzcyAqKW1hbGxvYyhzaXplb2YocHRwX3Byb2Nlc3MpKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXAtPmlkID0gZ2VuZXJhdGVfaWQoKTsKLQlwLT50YXNrX2lkID0gdGFza19pZDsKLQlwLT5waWQgPSBwaWQ7Ci0JcC0+bm9kZV9pZCA9IG5vZGVfaWQ7Ci0KLSAgICBqb2ItPnByb2NzW3Rhc2tfaWRdID0gcDsKLSAgICBpbnNlcnRfaW5fcmFuZ2VzZXQoam9iLT5zZXQsIHAtPmlkKTsKLQotICAgIHJldHVybiBwOwotfQotCi0KLS8qCi0gKiBGcmVlIHRoZSBzcGFjZSBhbGxvY2F0ZWQgdG8gcHRwX3Byb2Nlc3MuCi0gKi8KLXN0YXRpYyB2b2lkCi1mcmVlX3Byb2Nlc3MocHRwX3Byb2Nlc3MgKnApCi17Ci0JaWYgKHApCi0JCWZyZWUocCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogR2V0IHByb2Nlc3MgcG9pbnRlciBnaXZlbiBqb2IgYW5kIHRhc2tfaWQuCi0gKi8KLXN0YXRpYyBwdHBfcHJvY2VzcyAqCi1maW5kX3Byb2Nlc3MocHRwX2pvYiAqam9iLCBpbnQgdGFza19pZCkKLXsKLQlpZiAodGFza19pZCA8IDAgfHwgdGFza19pZCA+PSBqb2ItPm51bV9wcm9jcykKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCXJldHVybiBqb2ItPnByb2NzW3Rhc2tfaWRdOwotfQotCQotLyoKLSAqICBHZXQgam9iaWQgb2YgJ3doaWNoJyB0eXBlCi0gKi8KLXN0YXRpYyBpbnQKLWdldF9qb2JpZChwdHBfam9iICpqLCBpbnQgd2hpY2gpCi17Ci0JaW50IGlkID0gLTE7Ci0KLQlpZiAoaiAhPSBOVUxMKSB7Ci0JCXN3aXRjaCAod2hpY2gpIHsKLQkJY2FzZSBQVFBfSk9CSUQ6Ci0JCQlpZCA9IGotPnB0cF9qb2JpZDsKLQkJCWJyZWFrOwotCQljYXNlIFNMVVJNX0pPQklEOgotCQkJaWQgPSBqLT5zbHVybV9qb2JpZDsKLQkJCWJyZWFrOwotCQljYXNlIERFQlVHX0pPQklEOgotCQkJaWQgPSBqLT5kZWJ1Z19qb2JpZDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWQgPSAtMTsKLQkJCWJyZWFrOwotCQl9CQotCX0KLQotCXJldHVybiBpZDsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBqb2Isc2V0IGpvYiBhdHRyaWJ1dGVzIGFuZCBhZGQgdG8gZ0pvYkxpc3QuICAKLSAqLwotc3RhdGljIHB0cF9qb2IgKgotbmV3X2pvYihpbnQgbnVtX3Byb2NzLCBib29sIGRlYnVnLCBpbnQgcHRwX2pvYmlkLCBpbnQgc2x1cm1fam9iaWQsIGludCBkZWJ1Z19qb2JpZCwgYm9vbCBuZWVkX2FsbG9jKQotewotCXB0cF9qb2IgKglqID0gKHB0cF9qb2IgKiltYWxsb2Moc2l6ZW9mKHB0cF9qb2IpKTsKLQlpZiAoaiA9PSBOVUxMKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgIkFsbGNvYXRlIHNwYWNlIGZvciBqb2Igc3RydWN0IGZhaWwuIFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0JCi0KLQlqLT5wdHBfam9iaWQgPSBwdHBfam9iaWQ7Ci0gICAgai0+c2x1cm1fam9iaWQgPSBzbHVybV9qb2JpZDsKLQlqLT5uZWVkX2FsbG9jID0gbmVlZF9hbGxvYzsgCi0gICAgai0+bnVtX3Byb2NzID0gbnVtX3Byb2NzOwotICAgIGotPmRlYnVnID0gZGVidWc7Ci0Jai0+ZGVidWdfam9iaWQgPSBkZWJ1Z19qb2JpZDsKLQlqLT5hdHRhY2ggPSBmYWxzZTsKLQlqLT5zcnVuX3BpZCA9IC0xOwotCWotPnN0YXRlID0gLTE7Ci0Jai0+cmVtb3ZhYmxlID0gZmFsc2U7Ci0Jai0+ZmRfZXJyID0gLTE7Ci0Jai0+ZmRfb3V0ID0gLTE7Ci0Jai0+aW90aHJlYWRfaWQgPSAtMTsKLQlqLT5pb3RocmVhZF9leGl0X3JlcSA9IGZhbHNlOwotCWotPmlvdGhyZWFkX2V4aXQgPSBmYWxzZTsKLQlqLT5zZXQgPSBuZXdfcmFuZ2VzZXQoKTsKLQlqLT5wcm9jcyA9IChwdHBfcHJvY2VzcyAqKiltYWxsb2Moc2l6ZW9mKHB0cF9wcm9jZXNzICopICogbnVtX3Byb2NzKTsKLQltZW1zZXQoai0+cHJvY3MsIDAsIHNpemVvZihwdHBfcHJvY2VzcyAqKSAqIG51bV9wcm9jcyk7Ci0KLSAgICBBZGRUb0xpc3QoZ0pvYkxpc3QsICh2b2lkICopaik7Ci0KLSAgICByZXR1cm4gajsKLX0KLQotLyoKLSAqIEZyZWUgam9iIHNwYWNlIGFsbG9jYXRlZCBieSBuZXdfam9iKCkuCi0gKi8KLXN0YXRpYyB2b2lkCi1mcmVlX2pvYihwdHBfam9iICpqKQotewotCWludCBpOwotCi0JaWYgKGopIHsKLQkJaWYgKGotPnByb2NzKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgai0+bnVtX3Byb2NzOyBpKyspIHsKLQkJCQlpZiAoai0+cHJvY3NbaV0gIT0gTlVMTCkgCi0JCQkJCWZyZWVfcHJvY2VzcyhqLT5wcm9jc1tpXSk7Ci0JCQl9Ci0JCQlmcmVlKGotPnByb2NzKTsKLQkJfQotCQlpZiAoai0+c2V0KSAKLQkJCWZyZWVfcmFuZ2VzZXQoai0+c2V0KTsKLQotCQlmcmVlKGopOwotCX0JCi19Ci0KLQotLyoKLSAqIEdldCBqb2IgcG9pbnRlciBnaXZlbiB0aGUgam9iaWQgb2YgJ3doaWNoJyB0eXBlLgotICogSWYgZGVidWcgaXMgdHJ1ZSwgZmluZCB0aGUgam9iIHVzaW5nIHRoZSBkZWJ1ZyBqb2JpZC4KLSAqLwotc3RhdGljIHB0cF9qb2IgKgotZmluZF9qb2IoaW50IGpvYmlkLCBpbnQgd2hpY2gpCi17Ci0JcHRwX2pvYiAqCWogPSBOVUxMOwotCQotCWZvciAoU2V0TGlzdChnSm9iTGlzdCk7IChqID0gKHB0cF9qb2IgKilHZXRMaXN0RWxlbWVudChnSm9iTGlzdCkpICE9IE5VTEw7ICkgewotCQlpZiAoZ2V0X2pvYmlkKGosIHdoaWNoKSA9PSBqb2JpZCkgCi0JCQlyZXR1cm4gajsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBEZXRlcm1pbiBpZiB0aGUgZ2l2ZW4gam9iIGlzIEFDVElWRS4KLSAqLwotc3RhdGljIGJvb2wgCi1zbHVybV9qb2JfYWN0aXZlKHB0cF9qb2IgKiBqb2IpCi17Ci0JdWludDE2X3Qgc3RhdGU7Ci0JYm9vbCAJYWN0aXZlOwotCQotCXN0YXRlID0gam9iLT5zdGF0ZTsKLQlpZiAoc3RhdGUgPT0gSk9CX0NPTVBMRVRFIHx8IHN0YXRlID09IEpPQl9DQU5DRUxMRUQgCi0JCXx8IHN0YXRlID09IEpPQl9GQUlMRUQgfHwgc3RhdGUgPT0gSk9CX1RJTUVPVVQgfHwgc3RhdGUgPT0gSk9CX05PREVfRkFJTCkgewotCQlhY3RpdmUgPSBmYWxzZTsKLQl9IGVsc2UKLQkJYWN0aXZlID0gdHJ1ZTsgIC8qIEpPQl9DT01QTEVUSU5HIGlzIEFDVElWRSAqLwotCi0JcmV0dXJuIGFjdGl2ZTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRPS0V2ZW50KGludCB0cmFuc19pZCkKLXsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBwcm94eV9va19ldmVudCh0cmFuc19pZCkpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZFNodXRkb3duRXZlbnQoaW50IHRyYW5zX2lkKQotewotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X3NodXRkb3duX2V2ZW50KHRyYW5zX2lkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTWVzc2FnZUV2ZW50KGludCB0cmFuc19pZCwgY2hhciAqbGV2ZWwsIGludCBjb2RlLCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0CQlhcDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X21lc3NhZ2VfZXZlbnQodHJhbnNfaWQsIGxldmVsLCBjb2RlLCBmbXQsIGFwKSk7Ci0JdmFfZW5kKGFwKTsKLX0KLQotc3RhdGljIHZvaWQKLXNlbmRFcnJvckV2ZW50KGludCB0cmFuc19pZCwgaW50IGNvZGUsIGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QJCWFwOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JZGVidWdfbG9nKGxvZ2ZwLCAic2VuZEVycm9yRXZlbnQoJWQsJWQpLCIsIHRyYW5zX2lkLCBjb2RlKTsKLQlkZWJ1Z19sb2cobG9nZnAsIGZtdCxhcCk7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgcHJveHlfZXJyb3JfZXZlbnQodHJhbnNfaWQsIGNvZGUsIGZtdCwgYXApKTsKLQl2YV9lbmQoYXApOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZEpvYlN1YkVycm9yRXZlbnQoaW50IHRyYW5zX2lkLCBjaGFyICpqb2JTdWJJZCwgY2hhciAqbXNnKQotewotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X3N1Ym1pdGpvYl9lcnJvcl9ldmVudCh0cmFuc19pZCwgam9iU3ViSWQsIFJURVZfRVJST1JfU0xVUk1fU1VCTUlULCBtc2cpKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2VuZEpvYlRlcm1pbmF0ZUVycm9yRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgaWQsIGNoYXIgKm1zZykKLXsKLQljaGFyICoJam9iX2lkOwotCQotCWFzcHJpbnRmKCZqb2JfaWQsICIlZCIsIGlkKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBwcm94eV90ZXJtaW5hdGVqb2JfZXJyb3JfZXZlbnQodHJhbnNfaWQsIGpvYl9pZCwgUlRFVl9FUlJPUl9KT0IsIG1zZykpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5ld01hY2hpbmVFdmVudChpbnQgdHJhbnNfaWQsIGludCBpZCwgY2hhciAqbmFtZSkKLXsKLQljaGFyICoJcm1faWQ7Ci0JY2hhciAqCW1hY2hpbmVfaWQ7Ci0JCi0JYXNwcmludGYoJnJtX2lkLCAiJWQiLCBnQmFzZUlEKTsJCi0JYXNwcmludGYoJm1hY2hpbmVfaWQsICIlZCIsIGlkKTsJCi0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgcHJveHlfbmV3X21hY2hpbmVfZXZlbnQodHJhbnNfaWQsIHJtX2lkLCBtYWNoaW5lX2lkLCBuYW1lLCBNQUNISU5FX1NUQVRFX1VQKSk7Ci0JZnJlZShtYWNoaW5lX2lkKTsKLQlmcmVlKHJtX2lkKTsKLX0KLQotCi0vKgotICogR2V0IHRoZSBudW1iZXIgb2Ygbm9kZSBhdHRyaWJ1dGVzIHNldHVwIGluIHB0cF9ub2RlLgotICovCi1zdGF0aWMgaW50Ci1udW1fbm9kZV9hdHRycyhwdHBfbm9kZSAqbm9kZSkKLXsKLQlpbnQJY250ID0gMDsKLQotCWlmIChub2RlLT5udW1iZXIgPj0gMCkKLQkJY250Kys7Ci0JaWYgKG5vZGUtPnNvY2tldHMgPiAwKQotCQljbnQrKzsKLQlpZiAobm9kZS0+Y29yZXMgPiAwKQotCQljbnQrKzsKLQlpZiAobm9kZS0+dGhyZWFkcyA+IDApCi0JCWNudCsrOwotCWlmIChub2RlLT5hcmNoICE9IE5VTEwpCi0JCWNudCsrOwotCWlmIChub2RlLT5vcyAhPSBOVUxMKQotCQljbnQrKzsKLQotCXJldHVybiBjbnQ7CQotfQotCi0vKgotICogQWRkIG5vZGUgYXR0cmlidXRlcyB0byBwcm94eV9tc2cuIAotICovCi1zdGF0aWMgdm9pZAotYWRkX25vZGVfYXR0cnMocHJveHlfbXNnICptLCBwdHBfbm9kZSAqbm9kZSkKLXsKLQkKLSAgICAvKiBOT0RFX05VTUJFUl9BVFRSIGVuYWJsZXMgdGhlIG5vZGUgbnVtYmVyIHJ1bGVyIGluIE1hY2hpbmUgVmlldyAqLwotCWlmIChub2RlLT5udW1iZXIgPj0gMCkKLQkJcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgU0xVUk1fTk9ERV9OVU1CRVJfQVRUUiwgbm9kZS0+bnVtYmVyKTsKLQotCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIFNMVVJNX05PREVfU09DS0VUU19BVFRSLCAoaW50KW5vZGUtPnNvY2tldHMpOwotCXByb3h5X2FkZF9pbnRfYXR0cmlidXRlKG0sIFNMVVJNX05PREVfQ09SRVNfQVRUUiwgKGludClub2RlLT5jb3Jlcyk7Ci0JcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgU0xVUk1fTk9ERV9USFJFQURTX0FUVFIsIChpbnQpbm9kZS0+dGhyZWFkcyk7Ci0KLQlpZiAobm9kZS0+YXJjaCAhPSBOVUxMKQotCQlwcm94eV9hZGRfc3RyaW5nX2F0dHJpYnV0ZShtLCBTTFVSTV9OT0RFX0FSQ0hfQVRUUiwgbm9kZS0+YXJjaCk7Ci0JaWYgKG5vZGUtPm9zICE9IE5VTEwpCi0JCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG0sIFNMVVJNX05PREVfT1NfQVRUUiwgbm9kZS0+b3MpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5ld0pvYkV2ZW50KGludCB0cmFuc19pZCwgaW50IGpvYmlkLCBjaGFyICpuYW1lLCBjaGFyICpqb2JTdWJJZCwgY2hhciAqc3RhdGUpCi17Ci0JY2hhciAqCXF1ZXVlX2lkOwotCWNoYXIgKglqb2JfaWQ7Ci0JCi0JYXNwcmludGYoJnF1ZXVlX2lkLCAiJWQiLCBnUXVldWVJRCk7CQotCWFzcHJpbnRmKCZqb2JfaWQsICIlZCIsIGpvYmlkKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBwcm94eV9uZXdfam9iX2V2ZW50KHRyYW5zX2lkLCBxdWV1ZV9pZCwgam9iX2lkLCBuYW1lLCBzdGF0ZSwgam9iU3ViSWQpKTsKLQlmcmVlKHF1ZXVlX2lkKTsKLQlmcmVlKGpvYl9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTmV3Tm9kZUV2ZW50KGludCB0cmFuc19pZCwgaW50IG1hY2hpZCwgcHRwX21hY2hpbmUgKm1hY2gpCi17Ci0JcHRwX25vZGUgKgluOwotCXByb3h5X21zZyAqCW07Ci0JY2hhciAqCQltYWNoaW5lX2lkOwotCWNoYXIgKgkJbm9kZV9pZDsKLQkKLQlhc3ByaW50ZigmbWFjaGluZV9pZCwgIiVkIiwgbWFjaGlkKTsKLQltID0gcHJveHlfbmV3X25vZGVfZXZlbnQodHJhbnNfaWQsIG1hY2hpbmVfaWQsIFNpemVPZkxpc3QobWFjaC0+bm9kZXMpKTsKLQlmb3IgKFNldExpc3QobWFjaC0+bm9kZXMpOyAobiA9IChwdHBfbm9kZSAqKUdldExpc3RFbGVtZW50KG1hY2gtPm5vZGVzKSkgIT0gTlVMTDsgKSB7Ci0JCWFzcHJpbnRmKCZub2RlX2lkLCAiJWQiLCBuLT5pZCk7Ci0JCXByb3h5X2FkZF9ub2RlKG0sIG5vZGVfaWQsIG4tPm5hbWUsIG5vZGVzdGF0ZV90b19zdHJpbmcobi0+c3RhdGUpLCBudW1fbm9kZV9hdHRycyhuKSk7Ci0JCWFkZF9ub2RlX2F0dHJzKG0sIG4pOwotCQlmcmVlKG5vZGVfaWQpOwotCX0KLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBtKTsKLQlmcmVlKG1hY2hpbmVfaWQpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZE5vZGVDaGFuZ2VFdmVudChpbnQgdHJhbnNfaWQsIGNoYXIgKiBpZF9yYW5nZSwgY2hhciAqIHN0YXRlKQotewotCXByb3h5X21zZyAqIG07Ci0KLQltID0gcHJveHlfbm9kZV9jaGFuZ2VfZXZlbnQodHJhbnNfaWQsIGlkX3JhbmdlLCAxKTsKLQlwcm94eV9hZGRfc3RyaW5nX2F0dHJpYnV0ZShtLCBOT0RFX1NUQVRFX0FUVFIsIHN0YXRlKTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBtKTsKLX0KLQotLyoKLSAqIEZJWE1FOiAKLSAqCUFkZCBleHRyYSBhdHRyaWJ1dGVzIHdoZW4gdGFzayB0b3BvbG9neSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCi0gKiAgVGhpcyBjYW4gYmUgZG9uZSB2aWEgc2x1cm1fam9iX3N0ZXBfbGF5b3V0X2dldCgpIEFQSSB3aGVuIHVwZGF0aW5nIGpvYiBzdGF0ZS4KLSAqLwotc3RhdGljIHZvaWQKLXNlbmROZXdQcm9jZXNzRXZlbnQoaW50IHRyYW5zX2lkLCBpbnQgam9iaWQsIHB0cF9wcm9jZXNzICpwLCBjaGFyICpzdGF0ZSkKLXsKLQlwcm94eV9tc2cgKgltOwotCWNoYXIgKgkJam9iX2lkOwotCWNoYXIgKgkJcHJvY19pZDsKLQljaGFyICoJCW5hbWU7Ci0JCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCQotCWFzcHJpbnRmKCZqb2JfaWQsICIlZCIsIGpvYmlkKTsKLQlhc3ByaW50ZigmcHJvY19pZCwgIiVkIiwgcC0+aWQpOwotCWFzcHJpbnRmKCZuYW1lLCAiJWQiLCAgcC0+dGFza19pZCk7Ci0JCi0JbSA9IHByb3h5X25ld19wcm9jZXNzX2V2ZW50KHRyYW5zX2lkLCBqb2JfaWQsIDEpOwotCS8qCi0JICogQnkgbm93LCBwLT5ub2RlX2lkLCBwLT50YXNrX2lkLCBwLT5waWQgY2FuJ3QgYmUgb2J0YWluZWQuCi0JICogU28gc2V0IHRoZSBleHRyYV9hdHRycz0wCi0JICovCi0JcHJveHlfYWRkX3Byb2Nlc3MobSwgcHJvY19pZCwgbmFtZSwgc3RhdGUsIDApOwotCS8qCQotCXByb3h5X2FkZF9wcm9jZXNzKG0sIHByb2NfaWQsIG5hbWUsIHN0YXRlLCAzKTsKLQlwcm94eV9hZGRfaW50X2F0dHJpYnV0ZShtLCBQUk9DX05PREVJRF9BVFRSLCBwLT5ub2RlX2lkKTsJCi0JcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgUFJPQ19JTkRFWF9BVFRSLCBwLT50YXNrX2lkKTsJCi0JcHJveHlfYWRkX2ludF9hdHRyaWJ1dGUobSwgUFJPQ19QSURfQVRUUiwgcC0+cGlkKTsKLQkqLwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIG0pOwotCQotCWZyZWUoam9iX2lkKTsKLQlmcmVlKHByb2NfaWQpOwotCWZyZWUobmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kTmV3UXVldWVFdmVudChpbnQgdHJhbnNfaWQpCi17Ci0JY2hhciAqCQlybV9pZDsKLQljaGFyICoJCXF1ZXVlX2lkOwotCQotCWdRdWV1ZUlEID0gZ2VuZXJhdGVfaWQoKTsKLQkKLQlhc3ByaW50Zigmcm1faWQsICIlZCIsIGdCYXNlSUQpOwotCWFzcHJpbnRmKCZxdWV1ZV9pZCwgIiVkIiwgZ1F1ZXVlSUQpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIHByb3h5X25ld19xdWV1ZV9ldmVudCh0cmFuc19pZCwgcm1faWQsIHF1ZXVlX2lkLCBERUZBVUxUX1FVRVVFX05BTUUsIFFVRVVFX1NUQVRFX05PUk1BTCkpOwotCQotCWZyZWUocm1faWQpOwotCWZyZWUocXVldWVfaWQpOwotfQotCi1zdGF0aWMgdm9pZAotc2VuZFByb2Nlc3NTdGF0ZUNoYW5nZUV2ZW50KGludCB0cmFuc19pZCwgcHRwX2pvYiAqaiwgY2hhciAqc3RhdGUpCi17Ci0JcHJveHlfbXNnICoJbTsKLQkKLQlpZiAoaiA9PSBOVUxMIHx8IGotPm51bV9wcm9jcyA9PSAwKQotCQlyZXR1cm47Ci0JCQotCW0gPSBwcm94eV9wcm9jZXNzX2NoYW5nZV9ldmVudCh0cmFuc19pZCwgcmFuZ2VzZXRfdG9fc3RyaW5nKGotPnNldCksIDEpOwotCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG0sIFBST0NfU1RBVEVfQVRUUiwgc3RhdGUpOwotCXByb3h5X3N2cl9xdWV1ZV9tc2coc2x1cm1fcHJveHksIG0pOwotfQotCQotCQotc3RhdGljIHZvaWQKLXNlbmRKb2JTdGF0ZUNoYW5nZUV2ZW50KGludCB0cmFuc19pZCwgaW50IGpvYmlkLCBjaGFyICpzdGF0ZSkKLXsKLQljaGFyICoJCWpvYl9pZDsKLQlwcm94eV9tc2cgKgltOwotCQotCWFzcHJpbnRmKCZqb2JfaWQsICIlZCIsIGpvYmlkKTsKLQotCW0gPSBwcm94eV9qb2JfY2hhbmdlX2V2ZW50KHRyYW5zX2lkLCBqb2JfaWQsIDEpOwotCXByb3h5X2FkZF9zdHJpbmdfYXR0cmlidXRlKG0sIEpPQl9TVEFURV9BVFRSLCBzdGF0ZSk7Ci0JcHJveHlfc3ZyX3F1ZXVlX21zZyhzbHVybV9wcm94eSwgbSk7Ci0JCi0JZnJlZShqb2JfaWQpOwotfQotCi0vKgotICogU0xVUk0gcHJvdmlkZXMgbm8gcHJvY2VzcyBzdGF0ZSwgb25seSBqb2Igc3RhdGUuCi0gKiBMZXQgcHJvY2VzcyBzdGF0ZSBlcXVhbCB0byBqb2Igc3RhdGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1zZW5kUHJvY2Vzc0NoYW5nZUV2ZW50KGludCB0cmFuc19pZCwgcHRwX3Byb2Nlc3MgKnAsIGludCBub2RlX2lkLCBpbnQgdGFza19pZCwgaW50IHBpZCkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZW5kUHJvY2Vzc091dHB1dEV2ZW50KGludCB0cmFuc19pZCwgaW50IHByb2NpZCwgY2hhciAqb3V0cHV0KQotewotCWNoYXIgKgkJcHJvY19pZDsKLQlwcm94eV9tc2cgKgltOwotCQotCWFzcHJpbnRmKCZwcm9jX2lkLCAiJWQiLCBwcm9jaWQpOwotCQotCW0gPSBwcm94eV9wcm9jZXNzX2NoYW5nZV9ldmVudCh0cmFuc19pZCwgcHJvY19pZCwgMSk7Ci0JcHJveHlfYWRkX3N0cmluZ19hdHRyaWJ1dGUobSwgUFJPQ19TVERPVVRfQVRUUiwgb3V0cHV0KTsKLQlwcm94eV9zdnJfcXVldWVfbXNnKHNsdXJtX3Byb3h5LCBtKTsKLQkKLQlmcmVlKHByb2NfaWQpOwkKLX0KLQotLyoKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGNvbXB1dGUgbm9kZXMgbWFuYWdlZCBieSBTTFVSTS4KLSAqLwotc3RhdGljIGludAotZ2V0X251bV9ub2RlcyhpbnQgbWFjaGlkKQotewotCXVpbnQzMl90IGNudCA9IDA7Ci0Jbm9kZV9pbmZvX21zZ190ICogbmluZm87Ci0KLQlzbHVybV9sb2FkX25vZGUoKHRpbWVfdClOVUxMLCAmbmluZm8sIFNIT1dfQUxMKTsKLQljbnQgPSBuaW5mby0+cmVjb3JkX2NvdW50OwotCXNsdXJtX2ZyZWVfbm9kZV9pbmZvX21zZyhuaW5mbyk7Ci0JCi0JcmV0dXJuIGNudDsKLX0KLQotLyogCi0gKiBDdXJyZW50bHkgb25seSBPTkUgbWFjaGluZSBzdXBwb3J0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgCi1nZXRfbnVtX21hY2hpbmVzKCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIEdldCBob3N0bmFtZSBvZiB0aGUgc2VydmVyIG5vZGUgd2hlcmUgc2x1cm1jdGxkIHJ1bnMuCi0gKi8KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX25hbWUoaW50IG51bSkKLXsKLQlzdGF0aWMgY2hhcglob3N0bmFtZVs1MTJdOwotCQotCWdldGhvc3RuYW1lKGhvc3RuYW1lLCA1MTIpOwotCXJldHVybiBob3N0bmFtZTsKLX0KLQotLyoKLSAqIEN0ZWF0ZSB0aGUgbm9kZSBsaXN0IGZvciBhIG1hY2hpbmUuCi0gKi8KLXN0YXRpYyBpbnQKLWNyZWF0ZV9ub2RlX2xpc3QocHRwX21hY2hpbmUgKm1hY2gpCi17Ci0JdWludDMyX3QgY250OwotCW5vZGVfaW5mb19tc2dfdCAqbm1zZzsKLQlwdHBfbm9kZSAqCQlub2RlOwotCWludCBpOwotCi0JaWYgKHNsdXJtX2xvYWRfbm9kZSgodGltZV90KU5VTEwsJm5tc2csIFNIT1dfQUxMKSkKLQkJcmV0dXJuIC0xOwotCi0JY250ID0gbm1zZy0+cmVjb3JkX2NvdW50OwotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgCi0JCW5vZGUgPSBuZXdfbm9kZShtYWNoLCBubXNnLT5ub2RlX2FycmF5ICsgaSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIElmIHdlJ3JlIHVuZGVyIGRlYnVnIGNvbnRyb2wsIGxldCB0aGUgZGVidWdnZXIgaGFuZGxlIHByb2Nlc3Mgc3RhdGUgdXBkYXRlLiAKLSAqIAotICogTm90ZTogdGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBkZWJ1Z2dlciBhbGxvd3MgdGhlIHByb2dyYW0gdG8KLSAqIHJlYWNoIE1QSV9Jbml0KCksIHdoaWNoIG1heSBuZXZlciBoYXBwZW4gKGUuZy4gaWYgaXQncyBub3QgYW4gTVBJIHByb2dyYW0pLiAKLSAqIERvbid0IHJlbHkgdGhpcyB0byBkbyBhbnl0aGluZyBmb3IgYXJiaXRyYXJ5IGpvYnMuCi0gKiAKLSAqIE5vdGUgYWxzbzogdGhlIGRlYnVnZ2VyIG1hbmFnZXMgcHJvY2VzcyBzdGF0ZSB1cGRhdGVzIHNvIHdlIGRvbid0IG5lZWQKLSAqIHRvIHNlbmQgZXZlbnRzIGJhY2sgdG8gdGhlIHJ1bnRpbWUuCi0gKi8KLQotIAotLy9zdGF0aWMgdm9pZAotLy9kZWJ1Z19hcHBfam9iX3N0YXRlX2NhbGxiYWNrKG9ydGVfam9iaWRfdCBqb2JpZCwgb3J0ZV9wcm9jX3N0YXRlX3Qgc3RhdGUpCi0vL3sKLQkvKiB0aGlzIGlzIHdoYXQgaXQgaGFzIGJlZm9yZSwgdW50b3VjaGVkICovCi0vLwlzd2l0Y2goc3RhdGUpIHsKLS8vCQljYXNlIE9SVEVfUFJPQ19TVEFURV9URVJNSU5BVEVEOgotLy8JCWNhc2UgT1JURV9QUk9DX1NUQVRFX0FCT1JURUQ6Ci0vLwkJCWJyZWFrOwotLy8JfQotLy99Ci0KLS8qCi0gKiBqb2Jfc3RhdGVfY2FsbGJhY2sgZm9yIHRoZSBkZWJ1Z2dlci4gRGV0ZWN0cyBkZWJ1Z2dlciBzdGFydCBhbmQgZXhpdCBhbmQgbm90aWZpZXMgdGhlCi0gKiBVSS4gQ2xlYW5zIHVwIGpvYiBpZCBtYXAuCi0gKi8KLS8qIAotc3RhdGljIHZvaWQKLWRlYnVnX2pvYl9zdGF0ZV9jYWxsYmFjayhvcnRlX2pvYmlkX3Qgam9iaWQsIG9ydGVfcHJvY19zdGF0ZV90IHN0YXRlKQotewotCXB0cF9qb2IJKgkJajsKLQkKLQlpZiAoKGogPSBmaW5kX2pvYihqb2JpZCwgSk9CSURfREVCVUcpKSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JCi0JZG9fc3RhdGVfY2FsbGJhY2soaiwgc3RhdGUpOwotfQotKi8KLQotLyogCi0gKiBUZWxsIHRoZSBkYWVtb24gdG8gZXhpdC4gCi0gKiBOb29wcyBmb3IgU0xVUk0uCi0gKi8KLXN0YXRpYyBpbnQKLWRvX3NsdXJtX3NodXRkb3duKHZvaWQpCi17Ci0JZGVidWdfbG9nKGxvZ2ZwLCAiZG9fc2x1cm1fc2h1dGRvd24oKSBjYWxsZWQuXG4iKTsgCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIAotICogZ2V0aG9zdG5hbWVfc2hvcnQgLSBlcXVpdmFsZW50IHRvIGdldGhvc3RuYW1lLCBidXQgcmV0dXJuIG9ubHkgdGhlIGZpcnN0Ci0gKiBjb21wb25lbnQgb2YgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIAotICogKGUuZy4gImxpbnV4MTIzLmZvby5iYXIiIGJlY29tZXMgImxpbnV4MTIzIikgCi0gKi8KLXN0YXRpYyBpbnQKLWdldGhvc3RuYW1lX3Nob3J0IChjaGFyICpuYW1lLCBzaXplX3QgbGVuKQotewotCWludCBlcnJvcl9jb2RlLCBuYW1lX2xlbjsKLQljaGFyICpkb3RfcHRyLCBwYXRoX25hbWVbMTAyNF07Ci0KLQllcnJvcl9jb2RlID0gZ2V0aG9zdG5hbWUgKHBhdGhfbmFtZSwgc2l6ZW9mKHBhdGhfbmFtZSkpOwotCWlmIChlcnJvcl9jb2RlKQotCQlyZXR1cm4gZXJyb3JfY29kZTsKLQotCWRvdF9wdHIgPSBzdHJjaHIgKHBhdGhfbmFtZSwgJy4nKTsKLQlpZiAoZG90X3B0ciA9PSBOVUxMKQotCQlkb3RfcHRyID0gcGF0aF9uYW1lICsgc3RybGVuKHBhdGhfbmFtZSk7Ci0JZWxzZQotCQlkb3RfcHRyWzBdID0gJ1wwJzsKLQotCW5hbWVfbGVuID0gZG90X3B0ciAtIHBhdGhfbmFtZTsKLQlpZiAobmFtZV9sZW4gPiBsZW4pCi0JCXJldHVybiBFTkFNRVRPT0xPTkc7Ci0KLQlzdHJjcHkgKG5hbWUsIHBhdGhfbmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIFNldCBkZWZhdWx0IHNydW4gb3B0aW9ucy4KLSAqLwotc3RhdGljIGludCAKLW9wdF9kZWZhdWx0KHNydW5fb3B0X3QgKiBvcHQpCi17Ci0JY2hhciBidWZbTUFYUEFUSExFTiArIDFdOwotCXN0cnVjdCBwYXNzd2QgKnB3OwotCWludCBpOwotCWNoYXIgaG9zdG5hbWVbNjRdOwotCQotCWlmIChvcHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKChwdyA9IGdldHB3dWlkKGdldHVpZCgpKSkgIT0gTlVMTCkgewotCQlzdHJuY3B5KG9wdC0+cHNfdXNlciwgcHctPnB3X25hbWUsIE1BWF9VU0VSTkFNRSk7Ci0JCW9wdC0+cHNfdWlkID0gcHctPnB3X3VpZDsKLQl9IGVsc2UgewotCQlkZWJ1Z19sb2cobG9nZnAsICJvcHRfZGVmYXVsdDp3aG8gYXJlIHlvdT8iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW9wdC0+cHNfZ2lkID0gZ2V0Z2lkKCk7Ci0KLQlpZiAoKGdldGN3ZChidWYsIE1BWFBBVEhMRU4pKSA9PSBOVUxMKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwiZ2V0Y3dkIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW9wdC0+cHNfY3dkID0gc3RyZHVwKGJ1Zik7IAotCW9wdC0+cHNfY3dkX3NldCA9IGZhbHNlOwotCW9wdC0+cHNfcHJvZ25hbWUgPSBOVUxMOwotCW9wdC0+cHNfbnByb2NzID0gMTsKLQlvcHQtPnBzX25wcm9jc19zZXQgPSBmYWxzZTsKLQlvcHQtPnBzX2NwdXNfcGVyX3Rhc2sgPSAxOyAKLQlvcHQtPnBzX2NwdXNfc2V0ID0gZmFsc2U7Ci0Jb3B0LT5wc19taW5fbm9kZXMgPSAxOwotCW9wdC0+cHNfbWF4X25vZGVzID0gMDsKLQlvcHQtPnBzX21pbl9zb2NrZXRzX3Blcl9ub2RlID0gTk9fVkFMOyAvKiByZXF1ZXN0ZWQgbWluL21heHNvY2tldHMgKi8KLQlvcHQtPnBzX21heF9zb2NrZXRzX3Blcl9ub2RlID0gTk9fVkFMOwotCW9wdC0+cHNfbWluX2NvcmVzX3Blcl9zb2NrZXQgPSBOT19WQUw7IC8qIHJlcXVlc3RlZCBtaW4vbWF4Y29yZXMgKi8KLQlvcHQtPnBzX21heF9jb3Jlc19wZXJfc29ja2V0ID0gTk9fVkFMOwotCW9wdC0+cHNfbWluX3RocmVhZHNfcGVyX2NvcmUgPSBOT19WQUw7IC8qIHJlcXVlc3RlZCBtaW4vbWF4dGhyZWFkcyAqLwotCW9wdC0+cHNfbWF4X3RocmVhZHNfcGVyX2NvcmUgPSBOT19WQUw7IAotCW9wdC0+cHNfbnRhc2tzX3Blcl9ub2RlICAgICAgPSBOT19WQUw7IC8qIG50YXNrIG1heCBsaW1pdHMgKi8KLQlvcHQtPnBzX250YXNrc19wZXJfc29ja2V0ICAgID0gTk9fVkFMOyAKLQlvcHQtPnBzX250YXNrc19wZXJfY29yZSAgICAgID0gTk9fVkFMOyAKLQlvcHQtPnBzX25vZGVzX3NldCA9IGZhbHNlOwotCW9wdC0+cHNfY3B1X2JpbmRfdHlwZSA9IDA7Ci0Jb3B0LT5wc19jcHVfYmluZCA9IE5VTEw7Ci0Jb3B0LT5wc19tZW1fYmluZF90eXBlID0gMDsKLQlvcHQtPnBzX21lbV9iaW5kID0gTlVMTDsKLQlvcHQtPnBzX3RpbWVfbGltaXQgPSBOT19WQUw7Ci0Jb3B0LT5wc190aW1lX2xpbWl0X3N0ciA9IE5VTEw7Ci0Jb3B0LT5wc19ja3B0X2ludGVydmFsID0gMDsKLQlvcHQtPnBzX2NrcHRfaW50ZXJ2YWxfc3RyID0gTlVMTDsKLQlvcHQtPnBzX2NrcHRfcGF0aCA9IE5VTEw7Ci0Jb3B0LT5wc19wYXJ0aXRpb24gPSBOVUxMOwotCQotCS8vdXNlIGRlZmF1bHQgdmFsdWU6MzIKLQkvKiAKLQlvcHQtPnBzX21heF90aHJlYWRzID0gTUFYX1RIUkVBRFM7Ci0JcG1pX3NlcnZlcl9tYXhfdGhyZWFkcyhvcHQtPnBzX21heF90aHJlYWRzKTsKLQkqLwotCi0Jb3B0LT5wc19yZWxhdGl2ZSA9IE5PX1ZBTDsKLQlvcHQtPnBzX3JlbGF0aXZlX3NldCA9IGZhbHNlOwotCW9wdC0+cHNfam9iX25hbWUgPSBOVUxMOwotCW9wdC0+cHNfam9iX25hbWVfc2V0ID0gZmFsc2U7Ci0Jb3B0LT5wc19qb2JpZCA9IE5PX1ZBTDsKLQlvcHQtPnBzX2pvYmlkX3NldCA9IGZhbHNlOwotCW9wdC0+cHNfZGVwZW5kZW5jeSA9IE5VTEw7Ci0Jb3B0LT5wc19hY2NvdW50ICA9IE5VTEw7Ci0Jb3B0LT5wc19jb21tZW50ICA9IE5VTEw7Ci0KLQlvcHQtPnBzX2Rpc3RyaWJ1dGlvbiA9IFNMVVJNX0RJU1RfVU5LTk9XTjsKLQlvcHQtPnBzX3BsYW5lX3NpemUgICA9IE5PX1ZBTDsKLQotCW9wdC0+cHNfb2ZuYW1lID0gTlVMTDsKLQlvcHQtPnBzX2lmbmFtZSA9IE5VTEw7Ci0Jb3B0LT5wc19lZm5hbWUgPSBOVUxMOwotCi0Jb3B0LT5wc19jb3JlX3R5cGUgPSBDT1JFX0RFRkFVTFQ7Ci0KLQlvcHQtPnBzX2xhYmVsaW8gPSBmYWxzZTsKLQlvcHQtPnBzX3VuYnVmZmVyZWQgPSBmYWxzZTsKLQlvcHQtPnBzX292ZXJjb21taXQgPSBmYWxzZTsKLQlvcHQtPnBzX3NoYXJlZCA9ICh1aW50MTZfdClOT19WQUw7Ci0Jb3B0LT5wc19leGNsdXNpdmUgPSBmYWxzZTsKLQlvcHQtPnBzX25vX2tpbGwgPSBmYWxzZTsKLQlvcHQtPnBzX2tpbGxfYmFkX2V4aXQgPSBmYWxzZTsKLQotCW9wdC0+cHNfaW1tZWRpYXRlID0gZmFsc2U7Ci0KLQlvcHQtPnBzX2pvaW4gPSBmYWxzZTsKLQlzbHVybV9jdGxfY29uZl90ICogc2x1cm1fY3RsX2NvbmZfcHRyOwotCXNsdXJtX2xvYWRfY3RsX2NvbmYoKHRpbWVfdClOVUxMLCAmc2x1cm1fY3RsX2NvbmZfcHRyKTsKLQlvcHQtPnBzX21heF93YWl0ID0gc2x1cm1fY3RsX2NvbmZfcHRyLT53YWl0X3RpbWU7Ci0KLQlvcHQtPnBzX3F1aXRfb25faW50ciA9IGZhbHNlOwotCW9wdC0+cHNfZGlzYWJsZV9zdGF0dXMgPSBmYWxzZTsKLQlvcHQtPnBzX3Rlc3Rfb25seSAgID0gZmFsc2U7Ci0JCi0Jb3B0LT5wc19xdWlldCA9IDA7Ci0KLQlvcHQtPnBzX2pvYl9taW5fY3B1cyAgICA9IE5PX1ZBTDsKLQlvcHQtPnBzX2pvYl9taW5fc29ja2V0cyA9IE5PX1ZBTDsKLQlvcHQtPnBzX2pvYl9taW5fY29yZXMgICA9IE5PX1ZBTDsKLQlvcHQtPnBzX2pvYl9taW5fdGhyZWFkcyA9IE5PX1ZBTDsKLQlvcHQtPnBzX2pvYl9taW5fbWVtb3J5ICA9IE5PX1ZBTDsKLQlvcHQtPnBzX3Rhc2tfbWVtICAgICAgICA9IE5PX1ZBTDsKLQlvcHQtPnBzX2pvYl9taW5fdG1wX2Rpc2s9IE5PX1ZBTDsKLQotCW9wdC0+cHNfaG9sZCA9IGZhbHNlOwotCW9wdC0+cHNfY29uc3RyYWludHMgPSBOVUxMOwotCW9wdC0+cHNfY29udGlndW91cyA9IGZhbHNlOwotCW9wdC0+cHNfbm9kZWxpc3QgPSBOVUxMOwotCW9wdC0+cHNfZXhjX25vZGVzID0gTlVMTDsKLQlvcHQtPnBzX21heF9sYXVuY2hfdGltZSA9IDEyMDsvKiAxMjAgc2Vjb25kcyB0byBsYXVuY2ggam9iICovCi0Jb3B0LT5wc19tYXhfZXhpdF90aW1lb3V0PSA2MDsgLyogV2FybiB1c2VyIDYwIHNlY29uZHMgYWZ0ZXIgdGFzayBleGl0ICovCi0JLyogRGVmYXVsdCBsYXVuY2ggbXNnIHRpbWVvdXQgKi8KLQlvcHQtPnBzX21zZ190aW1lb3V0ID0gc2x1cm1fY3RsX2NvbmZfcHRyLT5tc2dfdGltZW91dDsgIAotCi0JZm9yIChpPTA7IGk8U1lTVEVNX0RJTUVOU0lPTlM7IGkrKykKLQkJb3B0LT5wc19nZW9tZXRyeVtpXSA9ICh1aW50MTZfdCkgTk9fVkFMOwotCW9wdC0+cHNfcmVib290ID0gZmFsc2U7Ci0Jb3B0LT5wc19ub19yb3RhdGUgPSBmYWxzZTsKLQlvcHQtPnBzX2Nvbm5fdHlwZSA9ICh1aW50MTZfdCkgTk9fVkFMOwotCW9wdC0+cHNfYmxydHNpbWFnZSA9IE5VTEw7Ci0Jb3B0LT5wc19saW51eGltYWdlID0gTlVMTDsKLQlvcHQtPnBzX21sb2FkZXJpbWFnZSA9IE5VTEw7Ci0Jb3B0LT5wc19yYW1kaXNraW1hZ2UgPSBOVUxMOwotCW9wdC0+cHNfZXVpZCA9ICh1aWRfdCkgLTE7Ci0Jb3B0LT5wc19lZ2lkID0gKGdpZF90KSAtMTsKLQlvcHQtPnBzX3Byb3BhZ2F0ZSA9IE5VTEw7ICAvKiBwcm9wYWdhdGUgc3BlY2lmaWMgcmxpbWl0cyAqLwotCW9wdC0+cHNfcHJvbG9nID0gc2x1cm1fY3RsX2NvbmZfcHRyLT5zcnVuX3Byb2xvZzsKLQlvcHQtPnBzX2VwaWxvZyA9IHNsdXJtX2N0bF9jb25mX3B0ci0+c3J1bl9lcGlsb2c7Ci0Jb3B0LT5wc190YXNrX3Byb2xvZyA9IE5VTEw7Ci0Jb3B0LT5wc190YXNrX2VwaWxvZyA9IE5VTEw7Ci0JZ2V0aG9zdG5hbWVfc2hvcnQoaG9zdG5hbWUsIHNpemVvZihob3N0bmFtZSkpOwotCW9wdC0+cHNfY3RybF9jb21tX2lmaG4gPSBzdHJkdXAoaG9zdG5hbWUpOwotCW9wdC0+cHNfcHR5ID0gZmFsc2U7Ci0Jb3B0LT5wc19vcGVuX21vZGUgPSAwOwotCW9wdC0+cHNfYWNjdGdfZnJlcSA9IC0xOwotCQotCWlmIChzbHVybV9jdGxfY29uZl9wdHIpCi0JCXNsdXJtX2ZyZWVfY3RsX2NvbmYoc2x1cm1fY3RsX2NvbmZfcHRyKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotLyogCi0gKiBJbml0aWFsaXplIG9wdGlvbiBkZWZhdWx0cy4gCi0gKi8KLXN0YXRpYyBpbnQKLXNldF9zcnVuX29wdGlvbnNfZGVmYXVsdHMoc3J1bl9vcHRfdCAqIG9wdCkKLXsKLQlyZXR1cm4gb3B0X2RlZmF1bHQob3B0KTsKLX0KLQotLyoKLSAqIEZyZWUgc3BhY2UgYWxsb2NhdGVkIGZvciBqb2IgIm9wdCIuIAotICovCi1zdGF0aWMgdm9pZCAKLWZyZWVfb3B0KHNydW5fb3B0X3QgKiBvcHQpCi17Ci0JaWYgKG9wdCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAob3B0LT5wc19jd2Rfc2V0ID09IHRydWUgJiYgb3B0LT5wc19jd2QgIT0gTlVMTCkKLQkJZnJlZShvcHQtPnBzX2N3ZCk7Ci0JaWYgKG9wdC0+cHNfbm9kZXNfc2V0ID09IHRydWUgJiYgb3B0LT5wc19ub2RlbGlzdCAhPSBOVUxMKQotCQlmcmVlKG9wdC0+cHNfbm9kZWxpc3QpOwotCWlmIChvcHQtPnBzX2N0cmxfY29tbV9pZmhuKSAvKiBhbGxvY2F0ZWQgaW4gb3B0X2RlZmF1bHQoKSAqLwotCQlmcmVlKG9wdC0+cHNfY3RybF9jb21tX2lmaG4pOwotfQotCi0vKgotICogRnJlZSBzcGFjZSBhbGxvY2F0ZWQgdG8gc2F2ZSBzcnVuIGFyZ3MgaW4gU0xVUk1fU3VibWl0Sm9iKCkuCi0gKi8KLXN0YXRpYyB2b2lkIAotZnJlZV9zcnVuX2FyZ3YoaW50IHNydW5fYXJnYyxjaGFyICoqIHNydW5fYXJndikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGk8IHNydW5fYXJnYzsgaSsrKSB7Ci0JCWlmIChzcnVuX2FyZ3ZbaV0gIT0gTlVMTCkKLQkJCWZyZWUoc3J1bl9hcmd2W2ldKTsKLQl9Ci0KLQlmcmVlKHNydW5fYXJndik7Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSBqb2IgZGVzYy4gbXNnIGZyb20gb3B0cyBmb3Igam9iIGFsbG9jYXRpb24uCi0gKiBCeSBub3csIC13Ly14IG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXN0YXRpYyBqb2JfZGVzY19tc2dfdCAqIAotY3JlYXRlX2pvYl9kZXNjX21zZ19mcm9tX29wdHMoc3J1bl9vcHRfdCAqb3B0KQotewotCi0Jam9iX2Rlc2NfbXNnX3QgKiBqID0gTlVMTDsKLQkKLQlhc3NlcnQob3B0ICE9IE5VTEwpOwotCWlmICgoaiA9IChqb2JfZGVzY19tc2dfdCAqKW1hbGxvYyhzaXplb2Yoam9iX2Rlc2NfbXNnX3QpKSkgPT0gTlVMTCkgewotCQlkZWJ1Z19sb2cobG9nZnAsICJBbGxvY2F0ZSBqb2JfZGVzZ19tc2cgZmFpbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlzbHVybV9pbml0X2pvYl9kZXNjX21zZyhqKTsKLQkKLQlpZiAob3B0LT5wc19hY2NvdW50KQotCQlqLT5hY2NvdW50ID0gc3RyZHVwKG9wdC0+cHNfYWNjb3VudCk7Ci0KLQlqLT5jb250aWd1b3VzICAgICA9IG9wdC0+cHNfY29udGlndW91czsKLQlqLT5mZWF0dXJlcyAgICAgICA9IG9wdC0+cHNfY29uc3RyYWludHM7Ci0Jai0+aW1tZWRpYXRlICAgICAgPSAodWludDE2X3Qpb3B0LT5wc19pbW1lZGlhdGU7Ci0Jai0+bmFtZSAgICAgICAgICAgPSBvcHQtPnBzX2pvYl9uYW1lOwotCi0JaWYgKG9wdC0+cHNfbm9kZWxpc3QpIAotCQlqLT5yZXFfbm9kZXMgPSBzdHJkdXAob3B0LT5wc19ub2RlbGlzdCk7Ci0JLyoKLQkgKiBGSVhNRTogaGFuZGxlIC13IG5vZGVsaXN0IHJlcXVlc3QKLQkgKi8KLQkvKgotCWlmKGotPnJlcV9ub2RlcykgewotCQlobCA9IGhvc3RsaXN0X2NyZWF0ZShqLT5yZXFfbm9kZXMpOwotCQlob3N0bGlzdF9yYW5nZWRfc3RyaW5nKGhsLCBzaXplb2YoYnVmKSwgYnVmKTsKLQkJeGZyZWUob3B0Lm5vZGVsaXN0KTsKLQkJb3B0Lm5vZGVsaXN0ID0geHN0cmR1cChidWYpOwotCQlob3N0bGlzdF91bmlxKGhsKTsKLQkJaG9zdGxpc3RfcmFuZ2VkX3N0cmluZyhobCwgc2l6ZW9mKGJ1ZiksIGJ1Zik7Ci0JCWhvc3RsaXN0X2Rlc3Ryb3koaGwpOwotCQl4ZnJlZShqLT5yZXFfbm9kZXMpOwotCQlqLT5yZXFfbm9kZXMgPSB4c3RyZHVwKGJ1Zik7Ci0JfQotCSovCi0JaWYob3B0LT5wc19kaXN0cmlidXRpb24gPT0gU0xVUk1fRElTVF9BUkJJVFJBUlkKLQkgICAmJiAhai0+cmVxX25vZGVzKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwiV2l0aCBBcmJpdHJhcnkgZGlzdHJpYnV0aW9uIHlvdSBuZWVkIHRvIFwKLQkJCQlzcGVjaWZ5IGEgbm9kZWxpc3Qgb3IgaG9zdGZpbGUgd2l0aCB0aGUgLXcgb3B0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlqLT5leGNfbm9kZXMgPSBvcHQtPnBzX2V4Y19ub2RlczsKLQlqLT5wYXJ0aXRpb24gPSBvcHQtPnBzX3BhcnRpdGlvbjsKLQlqLT5taW5fbm9kZXMgPSBvcHQtPnBzX21pbl9ub2RlczsKLQlpZiAob3B0LT5wc19taW5fc29ja2V0c19wZXJfbm9kZSAhPSBOT19WQUwpCi0JCWotPm1pbl9zb2NrZXRzID0gKHVpbnQxNl90KW9wdC0+cHNfbWluX3NvY2tldHNfcGVyX25vZGU7Ci0JaWYgKG9wdC0+cHNfbWluX2NvcmVzX3Blcl9zb2NrZXQgIT0gTk9fVkFMKQotCQlqLT5taW5fY29yZXMgPSAodWludDE2X3Qpb3B0LT5wc19taW5fY29yZXNfcGVyX3NvY2tldDsKLQlpZiAob3B0LT5wc19taW5fdGhyZWFkc19wZXJfY29yZSAhPSBOT19WQUwpCi0JCWotPm1pbl90aHJlYWRzID0gKHVpbnQxNl90KW9wdC0+cHNfbWluX3RocmVhZHNfcGVyX2NvcmU7Ci0Jai0+dXNlcl9pZCA9IG9wdC0+cHNfdWlkOwotCWotPmRlcGVuZGVuY3kgPSBvcHQtPnBzX2RlcGVuZGVuY3k7Ci0JaWYgKG9wdC0+cHNfbmljZSkKLQkJai0+bmljZSA9ICh1aW50MTZfdCkoTklDRV9PRkZTRVQgKyBvcHQtPnBzX25pY2UpOwotCWotPnRhc2tfZGlzdCA9ICh1aW50MTZfdClvcHQtPnBzX2Rpc3RyaWJ1dGlvbjsKLQlpZiAob3B0LT5wc19wbGFuZV9zaXplICE9IE5PX1ZBTCkKLQkJai0+cGxhbmVfc2l6ZSA9ICh1aW50MTZfdClvcHQtPnBzX3BsYW5lX3NpemU7Ci0Jai0+Z3JvdXBfaWQgPSBvcHQtPnBzX2dpZDsKLQlqLT5tYWlsX3R5cGUgPSBvcHQtPnBzX21haWxfdHlwZTsKLQotCWlmIChvcHQtPnBzX250YXNrc19wZXJfbm9kZSAhPSBOT19WQUwpCi0JCWotPm50YXNrc19wZXJfbm9kZSA9ICh1aW50MTZfdClvcHQtPnBzX250YXNrc19wZXJfbm9kZTsKLQlpZiAob3B0LT5wc19udGFza3NfcGVyX3NvY2tldCAhPSBOT19WQUwpCi0JCWotPm50YXNrc19wZXJfc29ja2V0ID0gKHVpbnQxNl90KW9wdC0+cHNfbnRhc2tzX3Blcl9zb2NrZXQ7Ci0JaWYgKG9wdC0+cHNfbnRhc2tzX3Blcl9jb3JlICE9IE5PX1ZBTCkKLQkJai0+bnRhc2tzX3Blcl9jb3JlID0odWludDE2X3Qpb3B0LT5wc19udGFza3NfcGVyX2NvcmU7Ci0KLQlpZiAob3B0LT5wc19tYWlsX3VzZXIpCi0JCWotPm1haWxfdXNlciA9IHN0cmR1cChvcHQtPnBzX21haWxfdXNlcik7Ci0JaWYgKG9wdC0+cHNfYmVnaW4pCi0JCWotPmJlZ2luX3RpbWUgPSBvcHQtPnBzX2JlZ2luOwotCWlmIChvcHQtPnBzX2xpY2Vuc2VzKQotCQlqLT5saWNlbnNlcyA9IHN0cmR1cChvcHQtPnBzX2xpY2Vuc2VzKTsKLQlpZiAob3B0LT5wc19uZXR3b3JrKQotCQlqLT5uZXR3b3JrID0gc3RyZHVwKG9wdC0+cHNfbmV0d29yayk7Ci0JaWYgKG9wdC0+cHNfY29tbWVudCkKLQkJai0+Y29tbWVudCA9IHN0cmR1cChvcHQtPnBzX2NvbW1lbnQpOwotCi0JaWYgKG9wdC0+cHNfaG9sZCkKLQkJai0+cHJpb3JpdHkgPSAwOwotCWlmIChvcHQtPnBzX2pvYmlkICE9IE5PX1ZBTCkKLQkJai0+am9iX2lkID0gb3B0LT5wc19qb2JpZDsKLQotCSNpZiBTWVNURU1fRElNRU5TSU9OUwotCWlmIChvcHQtPnBzX2dlb21ldHJ5WzBdID4gMCkgewotCQlpbnQgaTsKLQkJZm9yIChpPTA7IGk8U1lTVEVNX0RJTUVOU0lPTlM7IGkrKykKLQkJCWotPmdlb21ldHJ5W2ldID0gb3B0LT5wc19nZW9tZXRyeVtpXTsKLQl9Ci0JI2VuZGlmCi0KLQlpZiAob3B0LT5wc19jb25uX3R5cGUgIT0gKHVpbnQxNl90KSBOT19WQUwpCi0JCWotPmNvbm5fdHlwZSA9IG9wdC0+cHNfY29ubl90eXBlOwotCQkJCi0JaWYgKG9wdC0+cHNfcmVib290KQotCQlqLT5yZWJvb3QgPSAxOwotCWlmIChvcHQtPnBzX25vX3JvdGF0ZSkKLQkJai0+cm90YXRlID0gMDsKLQotCWlmIChvcHQtPnBzX2JscnRzaW1hZ2UpCi0JCWotPmJscnRzaW1hZ2UgPSBzdHJkdXAob3B0LT5wc19ibHJ0c2ltYWdlKTsKLQlpZiAob3B0LT5wc19saW51eGltYWdlKQotCQlqLT5saW51eGltYWdlID0gc3RyZHVwKG9wdC0+cHNfbGludXhpbWFnZSk7Ci0JaWYgKG9wdC0+cHNfbWxvYWRlcmltYWdlKQotCQlqLT5tbG9hZGVyaW1hZ2UgPSBzdHJkdXAob3B0LT5wc19tbG9hZGVyaW1hZ2UpOwotCWlmIChvcHQtPnBzX3JhbWRpc2tpbWFnZSkKLQkJai0+cmFtZGlza2ltYWdlID0gc3RyZHVwKG9wdC0+cHNfcmFtZGlza2ltYWdlKTsKLQotCWlmIChvcHQtPnBzX21heF9ub2RlcykKLQkJai0+bWF4X25vZGVzID0gb3B0LT5wc19tYXhfbm9kZXM7Ci0JaWYgKG9wdC0+cHNfbWF4X3NvY2tldHNfcGVyX25vZGUpCi0JCWotPm1heF9zb2NrZXRzID0gb3B0LT5wc19tYXhfc29ja2V0c19wZXJfbm9kZTsKLQlpZiAob3B0LT5wc19tYXhfY29yZXNfcGVyX3NvY2tldCkKLQkJai0+bWF4X2NvcmVzID0gb3B0LT5wc19tYXhfY29yZXNfcGVyX3NvY2tldDsKLQlpZiAob3B0LT5wc19tYXhfdGhyZWFkc19wZXJfY29yZSkKLQkJai0+bWF4X3RocmVhZHMgPSBvcHQtPnBzX21heF90aHJlYWRzX3Blcl9jb3JlOwotCi0JaWYgKG9wdC0+cHNfam9iX21pbl9jcHVzICE9IE5PX1ZBTCkKLQkJai0+am9iX21pbl9wcm9jcyA9IG9wdC0+cHNfam9iX21pbl9jcHVzOwotCWlmIChvcHQtPnBzX2pvYl9taW5fc29ja2V0cyAhPSBOT19WQUwpCi0JCWotPmpvYl9taW5fc29ja2V0cyA9IG9wdC0+cHNfam9iX21pbl9zb2NrZXRzOwotCWlmIChvcHQtPnBzX2pvYl9taW5fY29yZXMgIT0gTk9fVkFMKQotCQlqLT5qb2JfbWluX2NvcmVzID0gb3B0LT5wc19qb2JfbWluX2NvcmVzOwotCWlmIChvcHQtPnBzX2pvYl9taW5fdGhyZWFkcyAhPSBOT19WQUwpCi0JCWotPmpvYl9taW5fdGhyZWFkcyA9IG9wdC0+cHNfam9iX21pbl90aHJlYWRzOwotCWlmIChvcHQtPnBzX2pvYl9taW5fbWVtb3J5ICE9IE5PX1ZBTCkKLQkJai0+am9iX21pbl9tZW1vcnkgPSBvcHQtPnBzX2pvYl9taW5fbWVtb3J5OwotCWlmIChvcHQtPnBzX2pvYl9taW5fdG1wX2Rpc2sgIT0gTk9fVkFMKQotCQlqLT5qb2JfbWluX3RtcF9kaXNrID0gb3B0LT5wc19qb2JfbWluX3RtcF9kaXNrOwotCWlmIChvcHQtPnBzX292ZXJjb21taXQpIHsKLQkJai0+bnVtX3Byb2NzICA9IG9wdC0+cHNfbWluX25vZGVzOwotCQlqLT5vdmVyY29tbWl0ID0gb3B0LT5wc19vdmVyY29tbWl0OwotCX0gZWxzZQotCQlqLT5udW1fcHJvY3MgID0gb3B0LT5wc19ucHJvY3MgKiBvcHQtPnBzX2NwdXNfcGVyX3Rhc2s7Ci0JaWYgKG9wdC0+cHNfbnByb2NzX3NldCkKLQkJai0+bnVtX3Rhc2tzICA9IG9wdC0+cHNfbnByb2NzOwotCi0JaWYgKG9wdC0+cHNfY3B1c19zZXQpCi0JCWotPmNwdXNfcGVyX3Rhc2sgPSBvcHQtPnBzX2NwdXNfcGVyX3Rhc2s7Ci0KLQlpZiAob3B0LT5wc19ub19raWxsKQotCQlqLT5raWxsX29uX25vZGVfZmFpbCA9IDA7Ci0JaWYgKG9wdC0+cHNfdGltZV9saW1pdCAhPSBOT19WQUwpCi0JCWotPnRpbWVfbGltaXQgID0gb3B0LT5wc190aW1lX2xpbWl0OwotCWotPnNoYXJlZCA9IG9wdC0+cHNfc2hhcmVkOwotCi0JLyoKLQkgKiBzcnVuIHVzZXMgdGhlIHNhbWUgbGlzdGVuaW5nIHBvcnQgZm9yIHRoZSBhbGxvY2F0aW9uIHJlc3BvbnNlCi0JICogbWVzc2FnZSBhcyBmb3IgYWxsIG90aGVyIG1lc3NhZ2UuCi0JICogc2x1cm1jdGxkX2NvbW1fYWRkciBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgYnkgc2x1cm1jdGxkX21zZ19pbml0KCkKLQkgKi8KLQlqLT5hbGxvY19yZXNwX3BvcnQgPSBzbHVybWN0bGRfY29tbV9hZGRyLnBvcnQ7Ci0Jai0+b3RoZXJfcG9ydCA9IHNsdXJtY3RsZF9jb21tX2FkZHIucG9ydDsKLQotCXJldHVybiBqOwotfQotCi0vKgotICogQ2FsbGJhY2sgaGFuZGxlcnMgZm9yIGpvYiBhbGxvY2F0aW9uLgotICovCi1zdGF0aWMgdm9pZCAKLXRpbWVvdXRfaGFuZGxlcihzcnVuX3RpbWVvdXRfbXNnX3QgKm1zZykKLXsKLQlzdGF0aWMgdGltZV90IGxhc3RfdGltZW91dCA9IDA7Ci0KLQlpZiAobXNnLT50aW1lb3V0ICE9IGxhc3RfdGltZW91dCkgewotCQlsYXN0X3RpbWVvdXQgPSBtc2ctPnRpbWVvdXQ7Ci0JCWRlYnVnX2xvZyhsb2dmcCwiY2FsbGJhY2stLS0+dGltZW91dF9oYW5kbGVyOiIpOwotCQlkZWJ1Z19sb2cobG9nZnAsImpvYiB0aW1lIGxpbWl0IHRvIGJlIHJlYWNoZWQgYXQgJXMiLCAKLQkJCWN0aW1lKCZtc2ctPnRpbWVvdXQpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIAotdXNlcl9tc2dfaGFuZGxlcihzcnVuX3VzZXJfbXNnX3QgKm1zZykKLXsKLQlkZWJ1Z19sb2cobG9nZnAsImNhbGxiYWNrLS0tPnVzcl9tc2dfaGFuZGxlcjogJXMiLCBtc2ctPm1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1waW5nX2hhbmRsZXIoc3J1bl9waW5nX21zZ190ICptc2cpIAotewotCWRlYnVnX2xvZyhsb2dmcCwiY2FsbGJhY2stLS0+cGluZ3RfaGFuZGxlcjoiKTsKLX0KLQotCi1zdGF0aWMgdm9pZCAKLW5vZGVfZmFpbF9oYW5kbGVyKHNydW5fbm9kZV9mYWlsX21zZ190ICptc2cpCi17Ci0JZGVidWdfbG9nKGxvZ2ZwLCJjYWxsYmFjay0tLT5ub2RlX2ZhaWxfaGFuZGxlcjogTm9kZSBmYWlsdXJlIG9uICVzIiwgbXNnLT5ub2RlbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotam9iX2NvbXBsZXRlX2hhbmRsZXIoc3J1bl9qb2JfY29tcGxldGVfbXNnX3QgKiBtc2cpCi17Ci0JZGVidWdfbG9nKGxvZ2ZwLCJjYWxsYmFjay0tLT5qb2JfY29tcGxldGVfaGFuZGxlcjogRm9yY2UgVGVybWluYXRlIGpvYlxuIik7Ci19Ci0KLXN0YXRpYyBib29sIAotd2FpdF9yZXRyeSgpCi17Ci0Jc3RhdGljIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoY291bnQgPCBNQVhfUkVUUklFUykgewotCQlzbGVlcCgrK2NvdW50KTsKLQkJcmV0dXJuIHRydWU7Ci0JfWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi0vKgotICogSW5zdGFsbCBzaWdubyBoYW5kbGVyLgotICovCi1zdGF0aWMgU2lnRnVuYyAqCi14c2lnbmFsKGludCBzaWdubywgU2lnRnVuYyAqZikKLXsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIHNhLCBvbGRfc2E7Ci0KLQlzYS5zYV9oYW5kbGVyID0gZjsKLQlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7Ci0Jc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBzaWdubyk7Ci0Jc2Euc2FfZmxhZ3MgPSAwOwotCWlmIChzaWdhY3Rpb24oc2lnbm8sICZzYSwgJm9sZF9zYSkgPCAwKQotCQlkZWJ1Z19sb2cobG9nZnAsInhzaWduYWwoJWQpIGZhaWxlZDogJW0iLCBzaWdubyk7Ci0KLQlyZXR1cm4gb2xkX3NhLnNhX2hhbmRsZXI7Ci19Ci0KLS8qCi0gKiBTaWduYWwgaGFuZGxlciBkdXJpbmcgYWxsb2NhdGluZyBqb2JzLgotICovCi1zdGF0aWMgdm9pZAotc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcoaW50IHNpZ25vKQotewotCWRlc3Ryb3lfam9iID0gMTsKLQlpZiAoc3luY19tc2dfYWRkciAmJiAoc3luY19tc2dfYWRkci0+c2x1cm1fam9iaWQgPiAwKSkgCi0JCXNsdXJtX2NvbXBsZXRlX2pvYihzeW5jX21zZ19hZGRyLT5zbHVybV9qb2JpZCwgMCk7Ci19Ci0KLQotLyoKLSAqIFBlbmRpbmcgY2FsbGJhY2sgZHVyaW5nIGJsb2NrIGpvYiBhbGxvY2F0aW9uLgotICovCi1zdGF0aWMgdm9pZAotc2V0X3BlbmRpbmdfam9iaWQodWludDMyX3QgaWQpCi17Ci0JLyogCi0JICogVGhpcyBjYWxsYmFjayBjYW4gc2V0IHRoZSBqb2JpZCBldmVuIGluIHRoZSBjYXNlIG9mIGJsb2NraW5nIGFsbG9jYXRpb24uCi0JICogU28gcHJveHkgYWdlbnQgY2FuIGdldCB0aGUgc2x1cm0gam9iaWQgYW5kIHdpbGwgbm90IGJsb2NrIC4KLQkgKi8KLQkgaWYgKHN5bmNfbXNnX2FkZHIgIT0gTlVMTCkgewotCQlzeW5jX21zZ19hZGRyLT5zbHVybV9qb2JpZCA9IChpbnQpIGlkOwotCQlzeW5jX21zZ19hZGRyLT5qb2JpZF9zZXQgPSB0cnVlOwotCX0KLX0KLQotc3RhdGljIHZvaWQgCi1pZ25vcmVfc2lnbmFsKGludCBzaWdubykKLXsKLQkvKmRvIG5vdGhpbmcqLwotfQotCi0vKgotICogUmVsZWFzZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGpvYl9kZXNjX21zZy4KLSAqLwotc3RhdGljIHZvaWQgCi1kZXN0cm95X2pvYl9kZXNjX21zZyhqb2JfZGVzY19tc2dfdCAqIGopCi17Ci0JaWYgKGogIT0gTlVMTCkgewotCQlpZiAoai0+YWNjb3VudCAhPSBOVUxMKQotCQkJZnJlZShqLT5hY2NvdW50KTsKLQkJaWYgKGotPnJlcV9ub2RlcyAhPSBOVUxMKSAKLQkJCWZyZWUoai0+cmVxX25vZGVzKTsKLQkJaWYgKGotPm1haWxfdXNlciAhPSBOVUxMKQotCQkJZnJlZShqLT5tYWlsX3VzZXIpOwotCQlpZiAoai0+bGljZW5zZXMgIT0gTlVMTCkKLQkJCWZyZWUoai0+bGljZW5zZXMpOwotCQlpZiAoai0+bmV0d29yayAhPSBOVUxMKQotCQkJZnJlZShqLT5uZXR3b3JrKTsKLQkJaWYgKGotPmNvbW1lbnQgIT0gTlVMTCkKLQkJCWZyZWUoai0+Y29tbWVudCk7Ci0JCWlmIChqLT5ibHJ0c2ltYWdlICE9IE5VTEwpCi0JCQlmcmVlKGotPmJscnRzaW1hZ2UpOwotCQlpZiAoai0+bGludXhpbWFnZSAhPSBOVUxMKQotCQkJZnJlZShqLT5saW51eGltYWdlKTsKLQkJaWYgKGotPm1sb2FkZXJpbWFnZSAhPSBOVUxMKQotCQkJZnJlZShqLT5tbG9hZGVyaW1hZ2UpOwotCQlpZiAoai0+cmFtZGlza2ltYWdlICE9IE5VTEwpCi0JCQlmcmVlKGotPnJhbWRpc2tpbWFnZSk7Ci0KLQkJZnJlZShqKTsKLQl9Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBzb2NrZXQgdG8gY29tbXVuaWNhdGUgd2l0aCBzbHVybWN0bGQgCi0gKiBkdXJpbmcgam9iIGFsbG9jYXRpb24uIFRoaXMgZmQgd2lsbCBiZSBjbG9zZWQKLSAqIG9uIGV4ZWN1dGluZyBzcnVuIGFmdGVyIGpvYiBhbGxvY2F0aW9uLgotICovCi1zbHVybV9mZCAKLXNsdXJtX2luaXRfbXNnX2VuZ2luZV9wb3J0KHVpbnQxNl90IHBvcnQpCi17Ci0Jc2x1cm1fYWRkciBhZGRyOwotCi0JaW50IGZkOwotCWludCByYzsKLQljb25zdCBpbnQgb25lID0gMTsKLQljb25zdCBzaXplX3Qgc3oxID0gc2l6ZW9mKG9uZSk7Ci0KLQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotCi0JaWYgKChmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA8IDApIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJjcmVhdGUgc2x1cm1jdGxkIHNvY2tldCBlcnJvclxuIik7Ci0JCXJldHVybiBmZDsKLQl9Ci0JcmMgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsJm9uZSxzejEpOwotCWlmIChyYyA8IDApIHsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcmMgPSBiaW5kKGZkLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJjID0gbGlzdGVuKGZkLCAxMjgpOwotCWlmKHJjIDwgMCkgewotCQlnb3RvIGVycm9yOwotCX0KLQkKLQlyZXR1cm4gZmQ7Ci0KLWVycm9yOgotCWlmICgoY2xvc2UoZmQpIDwgMCkgJiYgKGVycm5vID09IEVJTlRSKSkKLQkJY2xvc2UoZmQpOyAvKnRyeSBhZ2FpbiovCi0JcmV0dXJuIHJjOwotfQotCi0KLS8qIAotICogSW5pdCBzb2NrZXQgZmQgdG8gaGFuZGxlIG1lc3NhZ2UgZnJvbSBzbHVybWN0bGQuCi0gKi8KLXNsdXJtX2ZkIAotc2x1cm1jdGxkX21zZ19pbml0KHNydW5fb3B0X3QgKiBvcHQpCi17Ci0Jc2x1cm1fYWRkciBzbHVybV9hZGRyZXNzOwotCXVpbnQxNl90IHBvcnQ7Ci0Jc3RhdGljIHNsdXJtX2ZkIHNsdXJtY3RsZF9mZCA9IDA7Ci0Jc29ja2xlbl90IG5hbWVfbGVuOwotCWludCBmdmFsOwotCWludCByYzsKLQkKLQlpZiAoc2x1cm1jdGxkX2ZkKQotCQlyZXR1cm4gc2x1cm1jdGxkX2ZkOwotCi0Jc2x1cm1jdGxkX2ZkID0gLTE7Ci0Jc2x1cm1jdGxkX2NvbW1fYWRkci5ob3N0bmFtZSA9IE5VTEw7Ci0Jc2x1cm1jdGxkX2NvbW1fYWRkci5wb3J0ID0gMDsKLQkKLQkvKiBvcGVuIHNvY2tldCAqLwotCWlmICgoc2x1cm1jdGxkX2ZkID0gc2x1cm1faW5pdF9tc2dfZW5naW5lX3BvcnQoMCkpIDwgMCkgewotCQlkZWJ1Z19sb2cobG9nZnAsICJzbHVybV9pbml0X21zZ19lbmdpbmVfcG9ydCBlcnJvclxuIik7Ci0JCXJldHVybiAtMTsJCi0JfQotCi0JLyogZ2V0IHNvY2tldCBwb3J0IG51bWJlciAqLwkKLQluYW1lX2xlbiA9IHNpemVvZihzbHVybV9hZGRyZXNzKTsKLQlpZiAoKHJjID0gZ2V0c29ja25hbWUoc2x1cm1jdGxkX2ZkLCAmc2x1cm1fYWRkcmVzcywgJm5hbWVfbGVuKSkgPCAwKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgImdldHNvY2tuYW1lIGVycm9yXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIHNldCBub24tYmxvY2tpbmcgKi8KLQlmdmFsID0gZmNudGwoc2x1cm1jdGxkX2ZkLCBGX0dFVEZMLCAwKTsKLQlmY250bChzbHVybWN0bGRfZmQsIEZfU0VURkwsIGZ2YWx8T19OT05CTE9DSyk7Ci0KLQkvKiBzZXQgRkRfQ0xPRVhFQzogY2xvc2Ugc2x1cm1jdGxkX2ZkIHdoZW4gZXhlYyhzcnVuKSBhZnRlciBhbGxvY2F0aW9uICovCi0JZnZhbCA9IGZjbnRsKHNsdXJtY3RsZF9mZCwgRl9HRVRGRCwgMCk7Ci0JZmNudGwoc2x1cm1jdGxkX2ZkLCBGX1NFVEZELCBmdmFsfEZEX0NMT0VYRUMpOwotCQotCS8qIHNldCBnbG9iYWwgdmFyLjogc2x1cm1jdGxkX2NvbW1fYWRkciAqLwotCXNsdXJtY3RsZF9jb21tX2FkZHIuaG9zdG5hbWUgPSBzdHJkdXAob3B0LT5wc19jdHJsX2NvbW1faWZobik7Ci0JcG9ydCA9IG50b2hzKHNsdXJtX2FkZHJlc3Muc2luX3BvcnQpOwotCXNsdXJtY3RsZF9jb21tX2FkZHIucG9ydCA9IHBvcnQ7Ci0KLQlyZXR1cm4gc2x1cm1jdGxkX2ZkOwotfQotCi0vKgotICogQWxsb2NhdGUgam9iIHJlc291cmNlIGluIHJlc3BvbnNlIHRvIFN1Ym1pdEpvYiBjbWQuCi0gKiBDYWxsZWQgaW4gY2hpbGQgcHJvY2VzcyAKLSAqLwotc3RhdGljIHJlc291cmNlX2FsbG9jYXRpb25fcmVzcG9uc2VfbXNnX3QgKgotYWxsb2NhdGVfbm9kZXMoc3J1bl9vcHRfdCAqb3B0KQotewotCXJlc291cmNlX2FsbG9jYXRpb25fcmVzcG9uc2VfbXNnX3QgKnJlc3AgPSBOVUxMOwotCXNsdXJtX2FsbG9jYXRpb25fY2FsbGJhY2tzX3QgY2FsbGJhY2tzOwotCi0Jc2x1cm1jdGxkX21zZ19pbml0KG9wdCk7Ci0Jam9iX2Rlc2NfbXNnX3QgKmogPSBjcmVhdGVfam9iX2Rlc2NfbXNnX2Zyb21fb3B0cyhvcHQpOwotCWlmICghaikgCi0JCXJldHVybiBOVUxMOwotCQotCS8qIAotCSAqIERvIG5vdCByZS11c2UgZXhpc3Rpbmcgam9iIGlkIHdoZW4gc3VibWl0dGluZyBuZXcgam9iCi0JICogZnJvbSB3aXRoaW4gYSBydW5uaW5nIGpvYiAKLQkgKi8KLQlpZiAoKGotPmpvYl9pZCAhPSBOT19WQUwpICYmICFvcHQtPnBzX2pvYmlkX3NldCkgewotCQlpZiAoIW9wdC0+cHNfam9iaWRfc2V0KQkvKiBMZXQgc2x1cm1jdGxkIHNldCBqb2JpZCAqLwotCQkJai0+am9iX2lkID0gTk9fVkFMOwotCX0KLQljYWxsYmFja3MucGluZyA9IHBpbmdfaGFuZGxlcjsKLQljYWxsYmFja3MudGltZW91dCA9IHRpbWVvdXRfaGFuZGxlcjsKLQljYWxsYmFja3Muam9iX2NvbXBsZXRlID0gam9iX2NvbXBsZXRlX2hhbmRsZXI7Ci0JY2FsbGJhY2tzLnVzZXJfbXNnID0gdXNlcl9tc2dfaGFuZGxlcjsKLQljYWxsYmFja3Mubm9kZV9mYWlsID0gbm9kZV9mYWlsX2hhbmRsZXI7Ci0KLQkvKiBjcmVhdGUgbWVzc2FnZSB0aHJlYWQgdG8gaGFuZGxlIHBpbmdzIGFuZCBzdWNoIGZyb20gc2x1cm1jdGxkICovCi0JbXNnX3RociA9IHNsdXJtX2FsbG9jYXRpb25fbXNnX3Rocl9jcmVhdGUoJmotPm90aGVyX3BvcnQsICZjYWxsYmFja3MpOwotCi0JeHNpZ25hbChTSUdIVVAsIHNpZ25hbF93aGlsZV9hbGxvY2F0aW5nKTsKLQl4c2lnbmFsKFNJR0lOVCwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCXhzaWduYWwoU0lHUVVJVCwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCXhzaWduYWwoU0lHUElQRSwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCXhzaWduYWwoU0lHVEVSTSwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCXhzaWduYWwoU0lHVVNSMSwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCXhzaWduYWwoU0lHVVNSMiwgc2lnbmFsX3doaWxlX2FsbG9jYXRpbmcpOwotCi0vLwl3aGlsZSAoIXJlc3ApIAotCXsKLQkJLyogCi0JCSAqIEJMT0NLIHVuaXRsIGFsbG9jYXRpb24gZ3JhbnRlZCBvciBpbnRlcnJ1cHQgYnkgc2lnbmFsCi0JCSAqIGlmIGFsbG9jYXRpb24gYmxvY2tlZC9wZW5kaW5nLCAKLQkJICogdGhlIGpvYmlkIGNhbiBiZSByZXR1cm5lZCB0byBwYXJlbnQgYnkgJ3NldF9wZW5kaW5nX2pvYmlkJyBjYWxsYmFjawotCQkgKi8KLQkJcmVzcCA9IHNsdXJtX2FsbG9jYXRlX3Jlc291cmNlc19ibG9ja2luZyhqLCAwLCBzZXRfcGVuZGluZ19qb2JpZCk7Ci0JCWlmIChyZXNwID09IE5VTEwpCi0JCQlkZWJ1Z19sb2cobG9nZnAsICJibG9ja2luZyBqb2IgYWxsb2NhdGUgZXJyb3IhXG4iKTsKLS8vCQlpZiAoZGVzdHJveV9qb2IpIC8qIGludGVycnVwdCBieSBzaWduYWwgKi8KLS8vCQkJYnJlYWs7Ci0vLwkgCWVsc2UgaWYoIXJlc3AgJiYgIXdhaXRfcmV0cnkoKSkgLyogdGltZSBvdXQgKi8gCi0vLwkJCWJyZWFrOwkJCi0JfQotCQotCi0JeHNpZ25hbChTSUdIVVAsIGlnbm9yZV9zaWduYWwpOwotCXhzaWduYWwoU0lHSU5ULCBpZ25vcmVfc2lnbmFsKTsKLQl4c2lnbmFsKFNJR1FVSVQsIGlnbm9yZV9zaWduYWwpOwotCXhzaWduYWwoU0lHUElQRSwgaWdub3JlX3NpZ25hbCk7Ci0JeHNpZ25hbChTSUdURVJNLCBpZ25vcmVfc2lnbmFsKTsKLQl4c2lnbmFsKFNJR1VTUjEsIGlnbm9yZV9zaWduYWwpOwotCXhzaWduYWwoU0lHVVNSMiwgaWdub3JlX3NpZ25hbCk7Ci0KLQlkZXN0cm95X2pvYl9kZXNjX21zZyhqKTsKLQlyZXR1cm4gcmVzcDsKLX0KLQotc3RhdGljIGludCAKLWhhbmRsZV9hdHRhY2hfZGVidWcoKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IAotaGFuZGxlX2RlYnVnKCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIHRocmVhZCB0byByZXRyaWV2ZSBzcnVuJ3Mgc3Rkb3V0L3N0ZGVyciwKLSAqIGFuZCBzZW5kIHRvIHB0cCB1aS4KLSAqLwotc3RhdGljIGludCAKLWNyZWF0ZV9pb3RocmVhZChwdHBfam9iICogam9iKQotewotCXB0aHJlYWRfYXR0cl90IGF0dHI7Ci0JcHRocmVhZF90IGlvdGhyZWFkX2lkOwotCWludCByYzsKLQkJCQkKLQlwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci0JcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7Ci0JaWYgKHB0aHJlYWRfY3JlYXRlKCZpb3RocmVhZF9pZCwgJmF0dHIsIHNydW5fb3V0cHV0X2ZvcndhcmRpbmcsICh2b2lkICopam9iKSA9PSAwICkgewotCQlqb2ItPmlvdGhyZWFkX2lkID0gaW90aHJlYWRfaWQ7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgImlvdGhyZWFkIGNyZWF0ZWQgZm9yIGpvYlslZF0uXG4iLCBqb2ItPnNsdXJtX2pvYmlkKTsKLQkJcmMgPSAwOwotCX0gZWxzZSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwiZXJyb3Igb24gY3JlYXRpbmcgaW90aHJlYWQgZm9yIGpvYlslZF0uXG4iLCBqb2ItPnNsdXJtX2pvYmlkKTsKLQkJcmMgPSAgLTE7Ci0JfQkKLQotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIEFsbG9jYXRlIGpvYiByZXNvdXJjZSBpZiBuZWNlc3NhcnksIGxhdW5jaCBqb2IKLSAqIGFuZCBmb3J3YXJkIGpvYiBzdGRvdXQvc3RkZXJyIHRvIHB0cCB1aS4gCi0gKi8KLXN0YXRpYyBpbnQgCi1hbGxvY2F0ZV9hbmRfbGF1bmNoX2pvYihpbnQgdHJhbnNfaWQsIGNoYXIgKiBqb2JzdWJpZCwgcHRwX2pvYiAqIGluLCBzcnVuX29wdF90ICogb3B0LCBpbnQgc3J1bl9hcmdjLCBjaGFyICogc3J1bl9hcmd2W10pCi17Ci0JaW50IGk7Ci0JaW50IHNobWlkOwotCWludCBmZF9vdXRbMl07Ci0JaW50IGZkX2VyclsyXTsKLQlib29sIG5lZWRfYWxsb2M7Ci0JcGlkX3QgcGlkOwotCWludCByYzsKLQljaGFyICogcHRyOwotCXN5bmNfbXNnICogcHAsICpwYzsKLQljaGFyICogbXNnOwotCXB0cF9qb2IgKiBqb2I7Ci0JY2hhciAqIG5hbWU7Ci0JcHRwX3Byb2Nlc3MgICogcDsKLQlpbnQgbm9kZV9pZCA9IC0xOwotCWludCB0YXNrX2lkID0gLTE7Ci0JaW50IHByb2NfcGlkID0gLTE7Ci0JcHRwX21hY2hpbmUgKiBtOwotCXB0cF9ub2RlICogbjsKLQlpbnQga2lsbF9qb2JpZCA9IC0xOwotCWludCBhbGxvY2F0ZWRfam9iaWQgPSAtMTsKLQlyZXNvdXJjZV9hbGxvY2F0aW9uX3Jlc3BvbnNlX21zZ190ICogcmVzcCA9IE5VTEw7Ci0KLQkvKiBjcmVhdGUgYSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiB0byBjb21tdW5pYXRlL3N5bmNocm9uaXplIHdpdGggY2hpbGQgcHJvY2VzcyAqLwotCWlmICgoc2htaWQgPSBzaG1nZXQoSVBDX1BSSVZBVEUsIHNpemVvZihzeW5jX21zZyksIFNITV9SfFNITV9XKSkgPCAwKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwiZXJyb3Igb24gY3JlYXRpbmcgc2hhcmVkIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogaW5pdCBzaG0gKi8KLQlwcCA9IChzeW5jX21zZyAqKXNobWF0KHNobWlkLCAwLCAwKTsKLQlwcC0+c2x1cm1fam9iaWQgPSBKT0JJRF9JTklUOwotCXBwLT5qb2JpZF9zZXQgPSBmYWxzZTsgCi0JcHAtPmlvX3JlYWR5ID0gZmFsc2U7Ci0KLQlwaXBlKGZkX291dCk7Ci0JcGlwZShmZF9lcnIpOyAKLQkKLQlpZiAob3B0LT5wc19qb2JpZCA9PSBOT19WQUwgJiYgb3B0LT5wc19qb2JpZF9zZXQgPT0gZmFsc2UpCi0JCW5lZWRfYWxsb2MgPSB0cnVlOwotCWVsc2UgewotCQluZWVkX2FsbG9jID0gZmFsc2U7Ci0JCWFsbG9jYXRlZF9qb2JpZCA9IG9wdC0+cHNfam9iaWQ7Ci0JfQkKLQotCXN3aXRjaCAocGlkID0gZm9yaygpKSB7Ci0JY2FzZSAwOgkvKiBjaGlsZDogYWxsb2NhdGUgam9iIGlmIG5lY2Vzc2FyeSBhbmQgbGF1bmNoIGpvYiB2aWEgc3J1biAqLwotCQkvKiBhdHRhY2ggc2htICovCi0JCXBjID0gKHN5bmNfbXNnICopc2htYXQoc2htaWQsIDAsIDApOwotCQkvKgotCQkgKiBzYXZlIHNobSBhZGRyIGluIGEgZ2xvYmFsIHZhcmlhYmxlLgotCQkgKiBpZiBqb2IgYWxsb2NhdGlvbiBibG9ja2VkLCBTTFVSTSBjYWxsYmFjayBjYW4gc3RvcmUgdGhlIHBlbmRpbmcgam9iIGlkIGF0IHRoaXMgYWRkciwgCi0JCSAqIHNvIHBhcmVudCBjYW4gZ2V0IHRoZSBzbHVybSBqb2JpZCB3aXRob3V0IGJsb2NraW5nLgotCQkgKi8KLQkJc3luY19tc2dfYWRkciA9IHBjOwotCi0JCWlmIChuZWVkX2FsbG9jKSB7IC8qIHJlcXVpcmUgbmV3IGpvYiBhbGxvY2F0aW9uICovCi0JCQlyZXNwID0gYWxsb2NhdGVfbm9kZXMob3B0KTsJCQkKLQkJCWlmIChyZXNwID09IE5VTEwgfHwgcmVzcC0+bm9kZV9saXN0ID09IE5VTEwpIHsgLyogYWxsb2NhdGlvbiBmYWlsLCByYXJlbHkgaGFwcGVuICovCi0JCQkJcGMtPnNsdXJtX2pvYmlkID0gSk9CSURfRkFJTDsKLQkJCQlwYy0+am9iaWRfc2V0ID0gdHJ1ZTsKLQkJCQlzaG1kdChwYyk7Ci0JCQkJZXhpdChFWElUX0pPQl9BTExPQ19GQUlMKTsgCi0JCQl9Ci0KLQkJCS8qIGFsbG9jYXRpb24gZ3JhbnRlZCAqLwotCQkJaWYgKHBjLT5qb2JpZF9zZXQgID09IGZhbHNlKSB7Ci0JCQkJcGMtPnNsdXJtX2pvYmlkID0gcmVzcC0+am9iX2lkOwotCQkJCXBjLT5qb2JpZF9zZXQgPSB0cnVlOwotCQkJfQkKLQkJCQotCQkJa2lsbF9qb2JpZCA9IHJlc3AtPmpvYl9pZDsKLQotCQkJYXNwcmludGYoJnB0ciwiJWQiLChpbnQpcmVzcC0+am9iX2lkKTsKLQkJCS8qIHNydW4gd2lsbCBubyBtb3JlIGFsbG9jYXRlIHJlc291cmNlIGlmIFNMVVJNX0pPQklEIHNldC4gKi8KLQkJCXNldGVudigiU0xVUk1fSk9CSUQiLCBwdHIsIDEpOwotCQkJZnJlZShwdHIpOwotCQkJaWYgKHJlc3ApCi0JCQkJc2x1cm1fZnJlZV9yZXNvdXJjZV9hbGxvY2F0aW9uX3Jlc3BvbnNlX21zZyhyZXNwKTsKLQkJfQotCQllbHNlIHsgCi0JCQkvKiAKLQkJCSAqIHJ1biBpbiBhbGxvY2F0ZWQgam9iIChyZXF1aXJlZCBieSBBVFRBQ0ggZGVidWcpCi0JCQkgKi8KLQkJCXBjLT5zbHVybV9qb2JpZCA9IGFsbG9jYXRlZF9qb2JpZDsKLQkJCXBjLT5qb2JpZF9zZXQgPSB0cnVlOwotCQkJYXNwcmludGYoJnB0ciwiJWQiLGFsbG9jYXRlZF9qb2JpZCk7Ci0JCQlzZXRlbnYoIlNMVVJNX0pPQklEIiwgcHRyLCAxKTsKLQkJCWZyZWUocHRyKTsKLQkJfQotCQkvKgotCQkgKiBCTE9DSyB1bnRpbCBwYXJlbnQgc2V0cyBpb19yZWFkeSB0byB0cnVlLAotCQkgKiB3aGljaCBtZWFucyB0aGUgaW8gdGhyZWFkIGlzIHJlYWR5LgotCQkgKiBQYXJlbnQgc2V0cyB0aGlzIGZsYWcgYWZ0ZXIgZ2V0dGluZyBqb2JpZCBhbmQgY3JlYXRlIGlvdGhyZWFkLgotCQkgKi8KLQkJd2hpbGUgKCFwYy0+aW9fcmVhZHkgJiYgd2FpdF9yZXRyeSgpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghcGMtPmlvX3JlYWR5KSB7Ci0JCQlpZiAobmVlZF9hbGxvYyl7Ci0JCQkJLy9zbHVybV9jb21wbGV0ZV9qb2Ioa2lsbF9qb2JpZCwgMCk7Ci0JCQkJc2x1cm1fa2lsbF9qb2Ioa2lsbF9qb2JpZCwgU0lHS0lMTCwgMCk7Ci0JCQl9CQotCQkJc2htZHQocGMpOwotCQkJZGVidWdfbG9nKGxvZ2ZwLCAiY2hpbGQgZXhpdHMgZHVlIHRvIGlvdGhyZWFkIGZhaWxcbiIpOwotCQkJZXhpdChFWElUX0pPQl9JT1RIUkVBRF9GQUlMKTsgCi0JCX0gZWxzZSB7IC8qIGlvIHRocmVhZCByZWFkeSAqLwotCQkJc2htZHQocGMpOwotCQkJLyogcmVkaXJlY3Qgc3J1bidzIHN0ZG91dCBhbmQgc3RkZXJyICovCi0JCQljbG9zZShmZF9vdXRbMF0pOwotCQkJY2xvc2UoZmRfZXJyWzBdKTsKLQkJCS8qIGpvYiBzdGRvdXQrc3RkZXJyID09PiBzcnVuJ3Mgc3Rkb3V0ICovCi0JCQlkdXAyKGZkX291dFsxXSwxKTsKLQkJCS8qIHNydW4gb3V0cHV0cyA9PT4gc3J1bidzIHN0ZGVyciAqLwotCQkJZHVwMihmZF9lcnJbMV0sMik7Ci0gCQkJLyogc3Bhd24gam9iIHdpdGggc3J1biBjbWQgKi8KLQkJCXJjID0gZXhlY3ZwKHNydW5fYXJndlswXSwgc3J1bl9hcmd2KTsgCi0JCQlpZiAocmMgPCAwKSB7LyogcmFyZWx5IGhhcHBlbnMgKi8KLQkJCQlpZiAobmVlZF9hbGxvYykgewotCQkJCQkvL3NsdXJtX2NvbXBsZXRlX2pvYihraWxsX2pvYmlkLCAwKTsKLSAJCQkJCXNsdXJtX2tpbGxfam9iKGtpbGxfam9iaWQsIFNJR0tJTEwsIDApOwotCQkJCX0JCi0JCQkJZGVidWdfbG9nKGxvZ2ZwLCJzcnVuIGV4ZWMgZmFpbFxuIik7Ci0JCQkJZXhpdChFWElUX0VYRUNfRkFJTCk7IAotCQkJfQkKLQkJfQotCQlicmVhazsKLQljYXNlIC0xOi8qIGVycm9yICovCi0JCWRlYnVnX2xvZyhsb2dmcCwiY2hpbGQgZm9yayBlcnJvclxuIik7Ci0JCWNsb3NlKGZkX291dFswXSk7Ci0JCWNsb3NlKGZkX291dFsxXSk7Ci0JCWNsb3NlKGZkX2VyclswXSk7Ci0JCWNsb3NlKGZkX2VyclsxXSk7Ci0JCWlmIChwcCkKLQkJCXNobWR0KHBwKTsKLQkJc2htY3RsKHNobWlkLElQQ19STUlELCAwKTsKLQkJcmV0dXJuIC0xOwotCWRlZmF1bHQ6LyogcGFyZW50ICovCi0JCS8qIAotCQkgKiBCTE9DSyB1bnRpbCBjaGlsZCBzZXQgdGhlIHNsdXJtIGpvYmlkICAKLQkJICovCi0JCXdoaWxlICghcHAtPmpvYmlkX3NldCAmJiB3YWl0X3JldHJ5KCkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghcHAtPmpvYmlkX3NldCB8fCBwcC0+c2x1cm1fam9iaWQgPT0gSk9CSURfRkFJTCkgeyAKLQkJCW1zZyA9ICJKb2IgYWxsb2NhdGlvbiBmYWlsIVxuUGxlYXNlIGNoZWNrIFJNUyBhbmQgam9iIGNvbmZpZyBwYXJhbWV0ZXJzISI7Ci0JCQlkZWJ1Z19sb2cobG9nZnAsIG1zZyk7Ci0JCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsIG1zZyk7Ci0JCQljbG9zZShmZF9vdXRbMF0pOwotCQkJY2xvc2UoZmRfb3V0WzFdKTsKLQkJCWNsb3NlKGZkX2VyclswXSk7Ci0JCQljbG9zZShmZF9lcnJbMV0pOwotCQkJc2htZHQocHApOwotCQkJa2lsbChwaWQsIFNJR0tJTEwpOyAKLQkJCXNobWN0bChzaG1pZCwgSVBDX1JNSUQsIDApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyogY2VhdGUgam9iIHN0cnVjdHVyZSBhZnRlciBnZXR0aW5nIHNsdXJtIGpvYmlkICovCi0JCWluLT5zbHVybV9qb2JpZCA9IHBwLT5zbHVybV9qb2JpZDsKLQkJam9iID0gbmV3X2pvYihpbi0+bnVtX3Byb2NzLCBpbi0+ZGVidWcsIGluLT5wdHBfam9iaWQsIGluLT5zbHVybV9qb2JpZCwgaW4tPmRlYnVnX2pvYmlkLCBuZWVkX2FsbG9jKTsKLQkJam9iLT5zcnVuX3BpZCA9IHBpZDsKLQkJCi0JCQotCQkvKiBzZW5kIE9LIGV2ZW50IGZvciBTdWJtaXRKb2IgY21kICovCQotCQlzZW5kT0tFdmVudCh0cmFuc19pZCk7Ci0JCi0JCS8qIHNlbmQgTmV3Sm9iIGV2ZW50ICovCi0JCWFzcHJpbnRmKCZuYW1lLCBTTFVSTV9KT0JfTkFNRV9GTVQsIGpvYi0+c2x1cm1fam9iaWQpOwotCQlzZW5kTmV3Sm9iRXZlbnQoZ1RyYW5zSUQsIGpvYi0+cHRwX2pvYmlkLCBuYW1lLCBqb2JzdWJpZCwgSk9CX1NUQVRFX0lOSVQpOwotCQlmcmVlKG5hbWUpOwotCi0JCS8qCi0JCSAqIEFzIHJlcXVpcmVkIGJ5IHB0cCB1aSwKLQkJICogb25lIE5ld1Byb2Nlc3MgRXZlbnQgTVVTVCBiZSBzZW50IGZvciBlYWNoIHByb2Nlc3Mgb2YgdGhpcyBuZXcgam9iLgotCQkgKi8KLQkJdGFza19pZCA9IDA7Ci0JCW5vZGVfaWQgPSAwOwotCQlwcm9jX3BpZCA9IDA7Ci0JCVNldExpc3QoZ01hY2hpbmVMaXN0KTsKLQkJLyogQnkgbm93LCBvbmx5IDEgbWFjaGluZSBpcyBzdXBwb3J0ZWQgKi8KLQkJbSA9IChwdHBfbWFjaGluZSAqKUdldEZpcnN0RWxlbWVudChnTWFjaGluZUxpc3QpOwotCQlTZXRMaXN0KG0tPm5vZGVzKTsKLQkJbiA9IChwdHBfbm9kZSAqKUdldExpc3RFbGVtZW50KG0tPm5vZGVzKTsKLQkJbm9kZV9pZCA9IG4tPmlkOyAvKiBub2RlX2lkIGNhbGN1bGF0ZWQgYnkgZ2VuZXJhdGVpZCgpICovCi0KLQkJZm9yIChpID0gMDsgaSA8IGpvYi0+bnVtX3Byb2NzOyBpKyspIHsKLQkJCS8qCi0JCQkgKiBTTFVSTSBwcm92aWRlIG5vIEFQSSB0byBnZXQgcGlkICxub2RlX2lkIGFuZCB0YXNrX2lkLgotCQkJICogQW5kIHRoZXNlIGluZm9ybWF0aW9uIGNhbiBvYnRhaW5lZCBPTkxZIGFmdGVyIGpvYiBsYXVuY2hpbmcuCi0JCQkgKiBTbyBGQUtFIHRoZW0gYnkgbm93LiAKLQkJCSAqIHNlbmROZXdQcm9jZXNzRXZlbnQoKSBzaG91bGRuJ3QgbWFrZSB1c2Ugb2YgdGhlc2UgZmlsZWRzLgotCQkJICogRklYTUU6Ci0JCQkgKgljYWxsIHNsdXJtX2pvYl9zdGVwX2xheW91dF9nZXQoKSB0byBvYnRhaW4gc3VjaCBpbmZvcm1hdGlvbgotCQkJICoJYW5kIHNlbmQgdG8gdWkgdmlhIHNlbmRQcm9jZXNzQ2hhbmdlRXZlbnQJCi0JCQkgKi8KLQkJCXAgPSBuZXdfcHJvY2Vzcyhqb2IsIG5vZGVfaWQsIHRhc2tfaWQsIHByb2NfcGlkKTsKLQkJCXNlbmROZXdQcm9jZXNzRXZlbnQoZ1RyYW5zSUQsIGpvYi0+cHRwX2pvYmlkLCBwLCBQUk9DX1NUQVRFX1NUQVJUSU5HKTsKLQkJCXRhc2tfaWQgKz0gMTsKLQkJCXByb2NfcGlkICs9IDE7Ci0JCSB9Ci0KLQkJY2xvc2UoZmRfb3V0WzFdKTsKLQkJY2xvc2UoZmRfZXJyWzFdKTsKLQkJam9iLT5mZF9vdXQgPSBmZF9vdXRbMF07Ci0JCWpvYi0+ZmRfZXJyID0gZmRfZXJyWzBdOwotCi0JCS8qIAotCQkgKiBDcmVhdGUgaW8gdGhyZWFkIHRvIG1hbmFnZSBzcnVuJ3Mgc3RkZXJyIGFuZCBzdGRvdXQgCi0JICAgICAqIERvbid0IHN0YXJ0IGl0IGJlZm9yZSBzZW5kaW5nIHRoZSBOZXdQcm9jZXNzIGV2ZW50cyEKLQkgICAgICovCi0JCWlmIChjcmVhdGVfaW90aHJlYWQoam9iKSA9PSAwKSB7Ci0JCQlwcC0+aW9fcmVhZHkgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJcHAtPmlvX3JlYWR5ID0gZmFsc2U7Ci0JCQlqb2ItPmlvdGhyZWFkX2V4aXQgPSB0cnVlOwotCQl9Ci0JCXNobWR0KHBwKTsKLQkJc2htY3RsKHNobWlkLCBJUENfUk1JRCwgMCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VhcmNoICRDV0QgYW5kICRQQVRIIGRpciBhbmQgcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGNtZC4gCi0gKi8KLXN0YXRpYyBjaGFyICoKLWdldF9wYXRoKGNoYXIgKiBjbWQsIGNoYXIgKiBjd2QsIGludCBtb2RlKQotewotCWNoYXIgKiBwYXRoID0gTlVMTDsKLQljaGFyICogZnVsbHBhdGggPSBOVUxMOwotCWNoYXIgKiBjOwotCWNoYXIgKiBwdHI7Ci0KLQlpZiAoIChjbWRbMF0gPT0gJy4nIHx8IGNtZFswXSA9PSAnLycpCi0JCSYmIGFjY2VzcyhjbWQsIG1vZGUpID09IDApIHsKLQkJaWYgKGNtZFswXSA9PSAnLicpIAotCQkJYXNwcmludGYoJmZ1bGxwYXRoLCIlcy8lcyIsY3dkLGNtZCk7Ci0JCWVsc2UgCi0JCQlhc3ByaW50ZigmZnVsbHBhdGgsY21kKTsKLQl9IGVsc2UgewotCQkvKiBzZWFyY2ggJFBBVEggKi8KLQkJcGF0aCA9IGdldGVudigiUEFUSCIpOwotCQlpZiAocGF0aCAhPSBOVUxMKSB7Ci0JCQljID0gcHRyID0gcGF0aDsKLQkJCXdoaWxlKChjPXN0cmNocihwdHIsJzonKSkgIT0gTlVMTCkgewotCQkJCSpjID0gJ1wwJzsKLQkJCQlhc3ByaW50ZigmZnVsbHBhdGgsICIlcy8lcyIscHRyLGNtZCk7Ci0JCQkJaWYgKGFjY2VzcyhmdWxscGF0aCwgbW9kZSkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZyZWUoZnVsbHBhdGgpOwotCQkJCQlmdWxscGF0aCA9IE5VTEw7Ci0JCQkJCXB0ciA9IGMgKyAxOwotCQkJCX0JCi0JCQl9Ci0JCQkvKiBoYW5kbGUgdGhlIGxhc3QgZWxlbWVudCAqLwotCQkJaWYgKCpwdHIgIT0gJ1wwJykgewotCQkJCWFzcHJpbnRmKCZmdWxscGF0aCwgIiVzLyVzIixwdHIsY21kKTsKLQkJCQlpZiAoYWNjZXNzKGZ1bGxwYXRoLCBtb2RlKSAhPSAwKSB7Ci0JCQkJCWZyZWUoZnVsbHBhdGgpOwotCQkJCQlmdWxscGF0aCA9IE5VTEw7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZnVsbHBhdGg7Ci19Ci0KLXNzaXplX3QgZmRfcmVhZF9saW5lKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbWF4bGVuKQotewotICAgIHNzaXplX3QgbiwgcmM7Ci0gICAgdW5zaWduZWQgY2hhciBjLCAqcDsKLQotICAgIG4gPSAwOwotICAgIHAgPSBidWY7Ci0gICAgd2hpbGUgKG4gPCBtYXhsZW4gLSAxKSB7ICAgLyogcmVzZXJ2ZSBzcGFjZSBmb3IgTlVMLXRlcm1pbmF0aW9uICovCi0JCWlmICgocmMgPSByZWFkKGZkLCAmYywgMSkpID09IDEpIHsKLQkJCW4rKzsKLQkJCSpwKysgPSBjOwotCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQlicmVhazsgICAgICAgICAvKiBzdG9yZSBuZXdsaW5lLCBsaWtlIGZnZXRzKCkgKi8KLQkJfWVsc2UgaWYgKHJjID09IDApIHsKLQkJCWlmIChuID09IDApICAgICAgICAvKiBFT0YsIG5vIGRhdGEgcmVhZCAqLwotCQkJCXJldHVybigwKTsKLQkJCWVsc2UgICAgICAgICAgICAgICAvKiBFT0YsIHNvbWUgZGF0YSByZWFkICovCi0JCQkJYnJlYWs7Ci0JCX1lbHNlIHsKLQkJCWlmIChlcnJubyA9PSBFSU5UUikKLQkJCQljb250aW51ZTsKLQkJCXJldHVybigtMSk7Ci0JCX0KLQl9Ci0KLQkqcCA9ICdcMCc7ICAvKiBOVUxMLXRlcm1pbmF0ZSwgbGlrZSBmZ2V0cygpICovCi0JcmV0dXJuKG4pOwotfQotCi0vKgotICogRm9yd2FyZGluZyBzcnVuJ3Mgc3Rkb3V0IHRvIHB0cCB1aQotICogRklYTUU6Ci0gKiAJCUhvdyBhYm91dCBzcnVuJ3Mgc3RkZXJyPyBCeSBub3csIGl0J3MgaWdub3JlZC4KLSAqLwotdm9pZCAqCi1zcnVuX291dHB1dF9mb3J3YXJkaW5nKHZvaWQgKiBhcmcpCi17Ci0JaW50IGZkID0gLTE7Ci0JY2hhciAqIHB0cjsKLQlwdHBfam9iICogam9iOwotCWludCB0YXNrX2lkOwotCWZkX3NldCByZmRzOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCWNoYXIgYnVmW01BWF9CVUZfU0laRV07Ci0JRklMRSAqIGZwID0gTlVMTDsKLQlpbnQgY2FuY2VsX3N0YXRlOwotCWludCBjYW5jZWxfdHlwZTsKLQlpbnQJcmV0OwotCWNoYXIgKiBwOwotCXBpZF90IGNwaWQ7Ci0JaW50IHN0YXR1czsKLQkKLQlwdGhyZWFkX3NldGNhbmNlbHN0YXRlKFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwmY2FuY2VsX3N0YXRlKTsKLQlwdGhyZWFkX3NldGNhbmNlbHR5cGUoUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsICZjYW5jZWxfdHlwZSk7Ci0JCi0Jam9iID0gKHB0cF9qb2IgKilhcmc7Ci0Jam9iLT5pb3RocmVhZF9leGl0ID0gZmFsc2U7Ci0JLyogQnkgbm93IG9ubHkgZm9jdXMgb24gam9iIHN0ZG91dCAqLwotCWZkID0gam9iLT5mZF9vdXQ7Ci0JCi0Jd2hpbGUgKDEpCi0JewotCQlpZiAoam9iLT5pb3RocmVhZF9leGl0X3JlcSkgewotCQkJZGVidWdfbG9nKGxvZ2ZwLCAiam9iWyVkXSBpb3RocmVhZCBleGl0IG9uIGV4aXRfcmVxdWVzdC5cbiIsIGpvYi0+c2x1cm1fam9iaWQpOwotCQkJam9iLT5pb3RocmVhZF9leGl0ID0gdHJ1ZTsKLQkJCWlmIChmcCkKLQkJCQlmY2xvc2UoZnApOwotCQkJcHRocmVhZF9leGl0KE5VTEwpOwotCQl9Ci0JCQotCQl0di50dl9zZWMgPSAwOwotCQl0di50dl91c2VjID0gNTAwMDsKLQkJCi0JCS8qIAotCQkgKiBpZiB0aW1lb3V0LCB0aGUgcmZkcyB3aWxsIGJlIGNsZWFyZWQgCi0JCSAqIHJmZHMgbXVzdCBiZSBzZXQgaW4gZWFjaCBpdGVyYXRpb24KLQkJICovCi0JCUZEX1pFUk8oJnJmZHMpOwotCQlGRF9TRVQoZmQsICZyZmRzKTsKLQkJcmV0ID0gc2VsZWN0KGZkKzEsJnJmZHMsTlVMTCxOVUxMLCZ0dik7Ci0KLQkJc3dpdGNoKHJldCkKLQkJewotCQljYXNlIC0xOiAvKiBlcnJvciAqLwotCQkJZGVidWdfbG9nKGxvZ2ZwLCJqb2JbJWRdIGlvdGhyZWFkIGV4aXQgb24gc2VsZWN0IGVycm9yXG4iLGpvYi0+c2x1cm1fam9iaWQpOwotCQkJaWYgKGZwKQotCQkJCWZjbG9zZShmcCk7Ci0JCQlqb2ItPmlvdGhyZWFkX2V4aXQgPSB0cnVlOwotCQkJcHRocmVhZF9leGl0KE5VTEwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAwOiAvKiB0aW1lb3V0ICovCi0JCQkvL2RlYnVnX2xvZyhsb2dmcCwic2VsZWN0IHRpbWVvdXRcbiIpOwotCQkJYnJlYWs7Ci0JCQkJCi0JCWRlZmF1bHQ6IC8qIGZkIHJlYWR5ICovCi0JCQlpZiAoZnAgPT0gTlVMTCkKLQkJCQlmcCA9IGZkb3BlbihmZCwiciIpOwotCQkJaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSAhPSBOVUxMKSB7Ci0JCQkvL2lmICgocmMgPSBmZF9yZWFkX2xpbmUoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKT4gMCApIHsKLQkJCQlwID0gYnVmOwotCQkJCS8qIGdldCB0YXNrIGlkIGZyb20gc3J1biBsYWJlbCAqLwotCQkJCXRhc2tfaWQgPSBhdG9pKHApOwotCQkJCXB0ciA9IHN0cmNocihwLCAnOicpOwotCQkJCXB0ciArKzsKLQkJCQlpZiAocHRyICE9IE5VTEwpIHsKLQkJCQkJLy9kZWJ1Z19sb2cobG9nZnAsInNlbmQgdGFza1slZF0gb3V0cHV0IHRvIHB0cCB1aVxuIiwgdGFza19pZCk7Ci0JCQkJCS8qIAotCQkJCQkgKiBubyBzeW5jaHJvbml6YXRpb24gbmVlZGVkIAotCQkJCQkgKiBzaW5jZSB0aGUgZXZlbnQgbGlzdCBpcyBpbnRlcm5hbGx5IHByb3RlY3RlZCBieSBwdGhyZWFkX211dGV4Ci0JCQkJCSAqLwotCQkJCQlwdHBfcHJvY2VzcyAqIHByb2M7Ci0JCQkJCXByb2MgPSBmaW5kX3Byb2Nlc3Moam9iLCB0YXNrX2lkKTsKLQkJCQkJc2VuZFByb2Nlc3NPdXRwdXRFdmVudChnVHJhbnNJRCwgcHJvYy0+aWQsIHB0cik7Ci0JCQkJfSBlbHNlIAotCQkJCQlkZWJ1Z19sb2cobG9nZnAsInByb2Nlc3MgbGFiZWwgbm90IGZvdW5kXG4iKTsKLQkJCX0gZWxzZSB7IC8qIGVycm9yIG9yIEVPRiBvZiBwaXBlKHdyaXRlIGVuZCBjbG9zZWQpICovCi0JCQkJZGVidWdfbG9nKGxvZ2ZwLCJFT0Ygb2YgcGlwZVxuIik7Ci0JCQkJaWYgKGZwKQotCQkJCQlmY2xvc2UoZnApOwotCQkJCWpvYi0+aW90aHJlYWRfZXhpdCA9IHRydWU7Ci0JCQkJY3BpZCA9IHdhaXRwaWQoam9iLT5zcnVuX3BpZCwgJnN0YXR1cywgMCk7Ci0JCQkJaWYgKGNwaWQgPT0gam9iLT5zcnVuX3BpZCkgewotCQkJCQlpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKLQkJCQkJCWlmIChqb2ItPm5lZWRfYWxsb2MpCi0JCQkJCQkJc2x1cm1fY29tcGxldGVfam9iKGpvYi0+c2x1cm1fam9iaWQsIDApOwotCQkJCQkJZGVidWdfbG9nKGxvZ2ZwLCAic3J1biBleGl0IGNvZGU6JWRcbiIsIFdFWElUU1RBVFVTKHN0YXR1cykpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKLQkJCQkJCWlmIChqb2ItPm5lZWRfYWxsb2MpCi0JCQkJCQkJc2x1cm1fa2lsbF9qb2Ioam9iLT5zbHVybV9qb2JpZCwgU0lHS0lMTCwgMCk7Ci0JCQkJCQlkZWJ1Z19sb2cobG9nZnAsICJzcnVuIHRlcm1pbmF0ZWQgYnkgc2lnbmFsWyVkXVxuIiwgV1RFUk1TSUcoc3RhdHVzKSk7Ci0JCQkJCX0KLQkJCQkJcHRocmVhZF9leGl0KE5VTEwpOwotCQkJCX0KLQkJCX0JCi0JCQlicmVhazsgCi0JCX0JCi0JfQkJCi0JCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBEZWxldGUgcmVtb3ZhYmxlIGpvYiBmcm8gZ0pvYkxpc3QuCi0gKi8KLXN0YXRpYyB2b2lkIAotcHVyZ2VfZ2xvYmFsX2pvYmxpc3QoKQotewotCXB0cF9qb2IgKiBqOwotCQotCWZvciAoU2V0TGlzdChnSm9iTGlzdCk7IChqID0gKHB0cF9qb2IgKilHZXRMaXN0RWxlbWVudChnSm9iTGlzdCkpICE9IE5VTEw7ICkgewotCQlpZiAoai0+aW90aHJlYWRfZXhpdCAmJiAhc2x1cm1fam9iX2FjdGl2ZShqKSkKLQkJCWotPnJlbW92YWJsZSA9IHRydWU7Ci0JCWlmIChqLT5yZW1vdmFibGUpIHsKLQkJCVJlbW92ZUZyb21MaXN0KGdKb2JMaXN0LCBqKTsKLQkJCWZyZWVfam9iKGopOwotCQl9CQotCX0KLQlyZXR1cm47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU1RBUlQgT0YgRElTUEFUQ0ggUk9VVElORVMgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1TTFVSTV9Jbml0aWFsaXplKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCWk7Ci0JaW50IAlwcmltYXJ5ID0gMTsKLQlpbnQgCXNlY29uZGFyeSA9IDI7Ci0JbG9uZwl2ZXJzaW9uOwotCQotCWRlYnVnX2xvZyhsb2dmcCwgIlNMVVJNX0luaXRpYWxpemUgKCVkKTpcbiIsIHRyYW5zX2lkKTsKLQkKLQlpZiAocHJveHlfc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TTFVSTV9JTklULCAiQWxyZWFkeSBpbml0aWFsaXplZCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoUFJPVE9DT0xfVkVSU0lPTl9BVFRSLCBhcmdzW2ldKSkgewotCQkJaWYgKHN0cmNtcChwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKSwgV0lSRV9QUk9UT0NPTF9WRVJTSU9OKSAhPSAwKSB7Ci0JCQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfU0xVUk1fSU5JVCwgIldpcmUgcHJvdG9jb2wgdmVyc2lvbiBcIiVzXCIgbm90IHN1cHBvcnRlZCIsIGFyZ3NbMF0pOwotCQkJCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoQkFTRV9JRF9BVFRSLCBhcmdzW2ldKSkgCi0JCQlnQmFzZUlEID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9pbnQoYXJnc1tpXSk7Ci0JfQotCi0JaWYgKGdCYXNlSUQgPCAwKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX1NMVVJNX0lOSVQsICJObyBiYXNlIElEIHN1cHBsaWVkIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotIAkvKiBjb25maXJtIHNsdXJtY3RsZCB3b3JrcyB3ZWxsIHZpYSBzbHVybV9waW5nICovIAotCWlmIChzbHVybV9waW5nKHByaW1hcnkpICYmIHNsdXJtX3Bpbmcoc2Vjb25kYXJ5KSkgewotCQlzZW5kRXJyb3JFdmVudCh0cmFuc19pZCwgUlRFVl9FUlJPUl9TTFVSTV9JTklULCAiTm8gcmVzcG9uc2UgZnJvbSBzbHVybWN0bGQuIENoZWNrIFNMVVJNIFJNUyEiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9CQotICAJLyogCi0JICogU0xVUk0gdmVyc2lvbiB2ZXJmaWNhdGlvbiwKLQkgKiBTaG91bGQgd29yayBvbiBtb3JlIHZlcnNpb25zIHN1cHBvcnRpbmcgdXNlZCBBUEkuIAotCSAqLwotCSB2ZXJzaW9uID0gc2x1cm1fYXBpX3ZlcnNpb24oKTsKLQkgaWYgKHZlcnNpb24gPCBTTFVSTV9WRVJTSU9OX05VTSgxLDMsNCkpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfU0xVUk1fSU5JVCwgIlNMVVJNIHZlcnNpb24gbnVtYmVyIHRvbyBsb3ciKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkgfQotCi0JcHJveHlfc3RhdGUgPSBTVEFURV9SVU5OSU5HOwotCXNlbmRPS0V2ZW50KHRyYW5zX2lkKTsKLQkKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKgotICogSW5pdCB0aGUgbW9kZWwgZGVmaW5pdGlvbiBwaGFzZS4KLSAqLwotaW50Ci1TTFVSTV9Nb2RlbERlZihpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JZGVidWdfbG9nKGxvZ2ZwLCAiU0xVUk1fTW9kZWxEZWYgKCVkKTpcbiIsIHRyYW5zX2lkKTsgCi0JCi0Jc2VuZE9LRXZlbnQodHJhbnNfaWQpOwotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19Ci0KLWludAotU0xVUk1fU3RvcEV2ZW50cyhpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JZGVidWdfbG9nKGxvZ2ZwLCAiU0xVUk1fU3RvcEV2ZW50cyAoJWQpOlxuIiwgdHJhbnNfaWQpOyAKLQotCS8qIE5vdGlmeSB0aGF0IHRhcnRFdmVudHMgY29tcGxldGUgKi8KLQlzZW5kT0tFdmVudChnVHJhbnNJRCk7Ci0JZ1RyYW5zSUQgPSAwOwotCXNlbmRPS0V2ZW50KHRyYW5zX2lkKTsKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwkKLX0KLQotCi0vKgotICogU3VibWl0IGEgam9iIHdpdGggdGhlIGdpdmVuIGV4ZWN1dGFibGUgcGF0aCBhbmQgYXJndW1lbnRzLiAKLSAqICgxKVByb2Nlc3MgY21kIGFyZ3VtZW50czsKLSAqICgyKURpc3Rpbmd1aXNoIGJldHdlZW4gZGVidWcgam9iIGFuZCBub24tZGVidWcgam9iOwotICogKDMpQWxsb2NhdGUgcmVzb3VyY2UgYW5kIHNwYXduIGpvYiBzdGVwLgotICovCi1pbnQKLVNMVVJNX1N1Ym1pdEpvYihpbnQgdHJhbnNfaWQsIGludCBuYXJncywgY2hhciAqKmFyZ3MpCi17Ci0JaW50CQlpLGs7Ci0JaW50CQludW1fYXJncyA9IDA7Ci0JaW50CQludW1fZW52ID0gMDsKLQljaGFyICoJam9ic3ViaWQgPSBOVUxMOyAvKiBqb2JpZCBhc3NpZ25lZCBieSBSTVModWkpICovCi0JCi0JLyogc3J1biBvcHRpb25zOiAtbiwgLU4sIC10LCAtcCwgLWwsIC12LCAtLWpvYmlkLCAtdywgLXgsIC0tam9iX3R5cGUgKi8KLQlpbnQJCW51bV9wcm9jcyA9IDA7IC8qIC1uOiBudW1iZXIgb2YgdGFza3MgdG8gcnVuKi8KLQlpbnQJCW51bV9ub2RlcyA9IDA7IC8qIC1OOiBudW1iZXIgb2Ygbm9kZXMgb24gd2hpY2ggdG8gcnVuIChOPW1pblstbWF4XSkgKi8KLQlpbnQJCXRsaW1pdCA9IC0xOyAgIC8qIC10OiB0aW1lIGxpbWl0ICovCQkKLQlib29sIAl0bGltaXRfc2V0ID0gZmFsc2U7Ci0JY2hhciAqIAlwYXJ0aXRpb24gPSBOVUxMOyAvKiAtcDogcGFydGl0aW9uIHJlcXVlc3RlZCAqLwotCWJvb2wJcGFydGl0aW9uX3NldCA9IGZhbHNlOwotCWJvb2wJaW9fbGFiZWwgPSBmYWxzZTsgLyogLWw6IHByZXBlbmQgdGFzayBudW1iZXIgdG8gbGluZXMgb2Ygc3Rkb3V0L2VyciAqLwotCWJvb2wgCWlvX2xhYmVsX3NldCA9IGZhbHNlOwotCWJvb2wgCXZlcmJvc2UgPSBmYWxzZTsJLyogLXY6dmVyYm9zZSBtb2RlICovCi0JYm9vbAl2ZXJib3NlX3NldCA9IGZhbHNlOwotCWNoYXIgKiAJbm9kZV9saXN0PU5VTEw7CS8qIC13OiByZXF1ZXN0IGEgc3BlY2lmaWMgbGlzdCBvZiBob3N0cyAqLwotCWJvb2wJbm9kZWxpc3Rfc2V0ID0gZmFsc2U7Ci0JaW50CQlhbGxvY2F0ZWRfam9iaWQ7IC8qIC0tam9iaWQ6IHJ1biB1bmRlciBhbHJlYWR5IGFsbG9jYXRlZCBqb2IgKi8KLQlib29sCWpvYmlkX3NldCA9IGZhbHNlOwotCWNoYXIgKiAJam9idHlwZSA9IE5VTEw7CS8qIC0tam9iX3R5cGU6bXBpLG9tcCxzZXJpYWwgKi8KLQlib29sCWpvYnR5cGVfc2V0ID0gZmFsc2U7Ci0KLQljaGFyICoJZnVsbF9wYXRoID0gTlVMTDsKLQljaGFyICoJY3dkID0gTlVMTDsKLQljaGFyICoJZXhlY19wYXRoID0gTlVMTDsgLyogUEFUSCBvZiBleGVjdXRhYmxlICovCi0JY2hhciAqCXBnbV9uYW1lID0gTlVMTDsgCi0JCi0JLyogZGVidWcgam9iIHN1cHBvcnQgKi8gCi0JYm9vbAlkZWJ1ZyA9IGZhbHNlOwotCWludAkJZGVidWdfYXJnYyA9IDA7Ci0JaW50CQlhdHRhY2hfbW9kZTsKLQljaGFyICoJZGVidWdfZXhlY19uYW1lID0gTlVMTDsKLQljaGFyICoJZGVidWdfZXhlY19wYXRoID0gTlVMTDsKLQljaGFyICoJZGVidWdfZnVsbF9wYXRoOwotCWNoYXIgKioJZGVidWdfYXJncyA9IE5VTEw7Ci0KLQlpbnQJCXNydW5fYXJnYyA9IDA7Ci0JY2hhciAqKiBzcnVuX2FyZ3YgPSBOVUxMOwotCWludCAJcmV0OwotCWludAkJcHRwaWQgPSBnZW5lcmF0ZV9pZCgpOwotCi0JZGVidWdfbG9nKGxvZ2ZwLCAiU0xVUk1fU3VibWl0Sm9iICglZCk6XG4iLCB0cmFuc19pZCk7Ci0JLyogUHJvY2VzcyBqb2Igc3VibWl0IGFyZ3MgICovCi0JZGVidWdfbG9nKGxvZ2ZwLCAiam9iIHN1Ym1pdCBjb21tYW5kczpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgIlx0JXNcbiIsIGFyZ3NbaV0pOwotCQlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX1NVQl9JRF9BVFRSLCBhcmdzW2ldKSkgewotCQkJam9ic3ViaWQgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfTlVNX1BST0NTX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQludW1fcHJvY3MgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfTlVNX05PREVTX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQludW1fbm9kZXMgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfVElNRV9MSU1JVF9BVFRSLCBhcmdzW2ldKSkgewotCQkJdGxpbWl0X3NldCA9IHRydWU7Ci0JCQl0bGltaXQgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2ludChhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfUEFSVElUSU9OX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlwYXJ0aXRpb25fc2V0ID0gdHJ1ZTsKLQkJCXBhcnRpdGlvbiA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9JT0xBQkVMX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlpb19sYWJlbF9zZXQgPSB0cnVlOwotCQkJaW9fbGFiZWwgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2Jvb2woYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX1ZFUkJPU0VfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCXZlcmJvc2Vfc2V0ID0gdHJ1ZTsKLQkJCXZlcmJvc2UgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2Jvb2woYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0lEX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlqb2JpZF9zZXQgPSB0cnVlOwotCQkJYWxsb2NhdGVkX2pvYmlkID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9pbnQoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX1RZUEVfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWpvYnR5cGVfc2V0ID0gdHJ1ZTsKLQkJCWpvYnR5cGUgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfTk9ERUxJU1RfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCW5vZGVsaXN0X3NldCA9IHRydWU7Ci0JCQlub2RlX2xpc3QgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfRVhFQ19OQU1FX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQlwZ21fbmFtZSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9FWEVDX1BBVEhfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWV4ZWNfcGF0aCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQl9IGVsc2UgaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9XT1JLSU5HX0RJUl9BVFRSLCBhcmdzW2ldKSkgewotCQkJY3dkID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX1BST0dfQVJHU19BVFRSLCBhcmdzW2ldKSkgewotCQkJbnVtX2FyZ3MrKzsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfRU5WX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQludW1fZW52Kys7Ci0JCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0RFQlVHX0FSR1NfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCWRlYnVnX2FyZ2MrKzsKLQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfREVCVUdfRkxBR19BVFRSLCBhcmdzW2ldKSkgewotCQkJZGVidWcgPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX2Jvb2woYXJnc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKiBEbyBzb21lIGNoZWNraW5nIGZpcnN0ICovCi0JaWYgKGpvYnN1YmlkID09IE5VTEwpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfU0xVUk1fU1VCTUlULCAibWlzc2luZyBJRCBvbiBqb2Igc3VibWlzc2lvbiIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQlpZiAocHJveHlfc3RhdGUgIT0gU1RBVEVfUlVOTklORykgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsICJtdXN0IGNhbGwgSU5JVCBmaXJzdCIpOwotCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCX0KLQlpZiAobmFyZ3MgPCAxKSB7Ci0JCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgImluY29ycmVjdCBhcmcgY291bnQiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0JaWYgKHBnbV9uYW1lID09IE5VTEwpIHsKLQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAibXVzdCBzcGVjaWZ5IGEgcHJvZ3JhbSBuYW1lIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCWlmIChudW1fcHJvY3MgPD0gMCkgewotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsICJtdXN0IHNwZWNpZnkgbnVtYmVyIG9mIHRhc2sgdG8gbGF1bmNoIik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCi0JLyoKLQkgKiBQcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcy4gCi0JICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgYmUgYnJvdWdodCB0byBjb21wdXRlIG5vZGUgCi0JICogYnkgU0xVUk0gYmVmb3JlIGxhdW5jaGluZyBqb2IuIAotCSAqLwotCWlmIChudW1fZW52ID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgewotCQkJaWYgKHByb3h5X3Rlc3RfYXR0cmlidXRlKFNMVVJNX0pPQl9FTlZfQVRUUiwgYXJnc1tpXSkpCi0JCQkJcHV0ZW52KHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pKTsKLQkJfQotCX0KLQkvKiBsb2NhdGUgZXhlY3VhYmxlICovCi0JaWYgKGV4ZWNfcGF0aCA9PSBOVUxMKSB7Ci0JCWZ1bGxfcGF0aCA9IGdldF9wYXRoKHBnbV9uYW1lLCBjd2QsIFhfT0spOwotCQlpZiAoZnVsbF9wYXRoID09IE5VTEwpIHsKLQkJCXNlbmRKb2JTdWJFcnJvckV2ZW50KHRyYW5zX2lkLCBqb2JzdWJpZCwgImV4ZWN1dGFibGUgbm90IGZvdW5kIik7Ci0JCQlyZXR1cm4gUFJPWFlfUkVTX09LOwotCQl9Ci0JfSBlbHNlIAotCQlhc3ByaW50ZigmZnVsbF9wYXRoLCAiJXMvJXMiLCBleGVjX3BhdGgsIHBnbV9uYW1lKTsKLQkvKiBjaGVjayBhY2Nlc3MgcmlnaHQgKi8JCQotCWlmIChhY2Nlc3MoZnVsbF9wYXRoLCBYX09LKSA8IDApIHsKLQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCBzdHJlcnJvcihlcnJubykpOwotCQlpZiAoZnVsbF9wYXRoICE9IE5VTEwpCi0JCQlmcmVlKGZ1bGxfcGF0aCk7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCS8qIGFsbG9jYXRlIHNwYWNlIGZvciBzcnVuIGFyZ3MgKi8KLQlzcnVuX2FyZ3YgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikqTUFYX1NSVU5fQVJHX05VTSk7Ci0JaWYgKHNydW5fYXJndiA9PSBOVUxMKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBzcnVuX2FyZ3YgZmFpbCIpOwotCQlzZW5kSm9iU3ViRXJyb3JFdmVudCh0cmFuc19pZCwgam9ic3ViaWQsICJtZW1vcnkgYWxsb2NhdGlvbiBmb3Igc3J1bl9hcmdzIGZhaWwiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQkvKgotCSAqRklYTUU6IG1vcmUgZGVidWcgam9iIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCBzb29uLgotCSAqLwotCS8qKioqKioqKioqKioqKioqaGFuZGxlIGRlYnVnIGpvYioqKioqKioqKioqKioqKioqLwotCWlmIChkZWJ1ZykgewkJCi0JCWRlYnVnX2FyZ2MrKzsKLQkJZGVidWdfYXJncyA9IChjaGFyICoqKW1hbGxvYygoZGVidWdfYXJnYysxKSAqIHNpemVvZihjaGFyICopKTsKLQkJZm9yIChpID0gMCwgayA9IDE7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCQlpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0RFQlVHX0FSR1NfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCQlkZWJ1Z19hcmdzW2srK10gPSBwcm94eV9nZXRfYXR0cmlidXRlX3ZhbHVlX3N0cihhcmdzW2ldKTsKLQkJCX0gZWxzZSBpZiAocHJveHlfdGVzdF9hdHRyaWJ1dGUoU0xVUk1fSk9CX0RFQlVHX0VYRUNfTkFNRV9BVFRSLCBhcmdzW2ldKSkgewotCQkJCWRlYnVnX2V4ZWNfbmFtZSA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfc3RyKGFyZ3NbaV0pOwotCQkJfSBlbHNlIGlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfREVCVUdfRVhFQ19QQVRIX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQkJZGVidWdfZXhlY19wYXRoID0gcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZGVidWdfYXJnc1trXSA9IE5VTEw7Ci0JCQotCQkvKgotCQkgKiBJZiBubyBwYXRoIHNwZWNpZmllZCwgdHJ5IHRvIGxvY2F0ZSBleGVjdWFibGUuCi0JCSAqLwkJCi0JCWlmIChkZWJ1Z19leGVjX3BhdGggPT0gTlVMTCkgewotCQkJZGVidWdfZnVsbF9wYXRoID0gZ2V0X3BhdGgoZGVidWdfZXhlY19uYW1lLCBjd2QsIFhfT0spOwotCQkJaWYgKGRlYnVnX2Z1bGxfcGF0aCA9PSBOVUxMKSB7Ci0JCQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCAiRGVidWdnZXIgZXhlY3V0dWFibGUgbm90IGZvdW5kIik7Ci0JCQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFzcHJpbnRmKCZkZWJ1Z19mdWxsX3BhdGgsICIlcy8lcyIsIGRlYnVnX2V4ZWNfcGF0aCwgZGVidWdfZXhlY19uYW1lKTsKLQkJfQotCQkKLQkJaWYgKGFjY2VzcyhkZWJ1Z19mdWxsX3BhdGgsIFhfT0spIDwgMCkgewotCQkJc2VuZEpvYlN1YkVycm9yRXZlbnQodHJhbnNfaWQsIGpvYnN1YmlkLCBzdHJlcnJvcihlcnJubykpOwotCQkJaWYgKGRlYnVnX2Z1bGxfcGF0aCAhPSBOVUxMKQotCQkJCWZyZWUoZGVidWdfZnVsbF9wYXRoKTsKLQkJCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JCX0KLQotCQlkZWJ1Z19hcmdzWzBdID0gc3RyZHVwKGRlYnVnX2Z1bGxfcGF0aCk7Ci0JCWlmIChkZWJ1Z19mdWxsX3BhdGggIT0gTlVMTCkKLQkJCWZyZWUoZGVidWdfZnVsbF9wYXRoKTsKLQl9Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQkvKiBzZXQgZGVmYXVsdCBzcnVuIG9wdGlvbnMgKi8KLQlzZXRfc3J1bl9vcHRpb25zX2RlZmF1bHRzKCZvcHQpOwotCi0JLyoKLQkgKiBjaGFuZ2Ugc3J1biBvcHRpb25zIGJhc2VkIG9uIFN1Ym1pdEpvYiBjbWQgYXJncwotCSAqIGFuZCBwcmVwYXJlIHNydW5fYXJnYyxzcnVuX2FyZ3YKLQkgKi8KLQlpbnQgaW5kZXggPSAwOwotCXNydW5fYXJndltpbmRleCsrXSA9IHN0cmR1cCgic3J1biIpOwotCi0JaWYgKG51bV9wcm9jcyA+IDApIHsKLQkJb3B0LnBzX25wcm9jcyA9IG51bV9wcm9jczsKLQkJb3B0LnBzX25wcm9jc19zZXQgPSB0cnVlOwotCQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiLS1udGFza3M9JWQiLCBvcHQucHNfbnByb2NzKTsKLQkJaW5kZXggKz0gMTsKLQl9CQotCWlmIChudW1fbm9kZXMgPiAwKSB7Ci0JCW9wdC5wc19taW5fbm9kZXMgPSBudW1fbm9kZXM7Ci0JCW9wdC5wc19ub2Rlc19zZXQgPSB0cnVlOwotCQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiLS1ub2Rlcz0lZCIsIG9wdC5wc19taW5fbm9kZXMpOwotCQlpbmRleCArPSAxOwotCX0KLQlpZiAodGxpbWl0X3NldCkgewotCQlvcHQucHNfdGltZV9saW1pdCA9IHRsaW1pdDsKLQkJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIi0tdGltZT0lZCIsIG9wdC5wc190aW1lX2xpbWl0KTsKLQkJaW5kZXggKz0gMTsKLQl9Ci0JaWYgKHBhcnRpdGlvbl9zZXQpIHsKLQkJb3B0LnBzX3BhcnRpdGlvbiA9ICBwYXJ0aXRpb247Ci0JCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLXBhcnRpdGlvbj0lcyIsIG9wdC5wc19wYXJ0aXRpb24pOwotCQlpbmRleCArPSAxOwotCX0KLQkvKiBUbyBkaXN0aW5ndWlzaCB0YXNrIHN0ZG91dCwgdGhpcyBvcHRpb24gTVVTVCBiZSBzZXQgKi8KLQlpb19sYWJlbF9zZXQgPSB0cnVlOwotCWlmIChpb19sYWJlbF9zZXQpIHsgCi0JCW9wdC5wc19sYWJlbGlvID0gaW9fbGFiZWw7Ci0JCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLWxhYmVsIik7Ci0JCWluZGV4ICs9IDE7Ci0JfQotCWlmICh2ZXJib3NlX3NldCkgewotCQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiLS12ZXJib3NlIik7Ci0JCWluZGV4ICs9IDE7Ci0JfQotCWlmIChqb2JpZF9zZXQpIHsKLQkJb3B0LnBzX2pvYmlkID0gYWxsb2NhdGVkX2pvYmlkOwotCQlvcHQucHNfam9iaWRfc2V0ID0gdHJ1ZTsKLQkJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIi0tam9iaWQ9JWQiLCBvcHQucHNfam9iaWQpOwotCQlpbmRleCArPSAxOwotCX0KLQkKLQkvKmlmIChqb2J0eXBlX3NldCkgewotCQlvcHQucHNfam9idHlwZSA9IGpvYnR5cGU7Ci0gICAgCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLWpvYnR5cGU9JXMiLCBvcHQucHNfam9idHlwZSk7Ci0JCWluZGV4ICs9IDE7Ci0JfQotCSovCi0JaWYgKG5vZGVsaXN0X3NldCkgewotCQlvcHQucHNfbm9kZWxpc3QgPSBzdHJkdXAobm9kZV9saXN0KTsKLQkJb3B0LnBzX25vZGVzX3NldCA9IHRydWU7Ci0JCWFzcHJpbnRmKCYoc3J1bl9hcmd2W2luZGV4XSksICItLW5vZGVsaXN0PSVzIiwgb3B0LnBzX25vZGVsaXN0KTsKLQkJaW5kZXggKz0gMTsKLQl9Ci0KLQlpZiAoY3dkKSB7Ci0JCWlmIChvcHQucHNfY3dkICE9IE5VTEwpCi0JCQlmcmVlKG9wdC5wc19jd2QpOwotCQlvcHQucHNfY3dkID0gc3RyZHVwKGN3ZCk7Ci0JCW9wdC5wc19jd2Rfc2V0ID0gdHJ1ZTsKLQl9Ci0KLQlvcHQucHNfcHJvZ25hbWUgPSBmdWxsX3BhdGg7Ci0JLyogc2V0IGpvYiBuYW1lLG90aGVyd2lzZSBiZSBOVUxMICovCi0Jb3B0LnBzX2pvYl9uYW1lID0gYmFzZW5hbWUoZnVsbF9wYXRoKTsKLQlhc3ByaW50ZigmKHNydW5fYXJndltpbmRleF0pLCAiJXMiLCBvcHQucHNfcHJvZ25hbWUpOwotCWluZGV4ICs9IDE7Ci0JCi0JLyogcHJvZ3JhbSBuYW1lIGZvbGxvd2QgYnkgYXJncyAqLwotCWlmIChudW1fYXJncyA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKLQkJCWlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShTTFVSTV9KT0JfUFJPR19BUkdTX0FUVFIsIGFyZ3NbaV0pKSB7Ci0JCQkJYXNwcmludGYoJihzcnVuX2FyZ3ZbaW5kZXhdKSwgIiVzIiwgcHJveHlfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9zdHIoYXJnc1tpXSkpOwotCQkJCWluZGV4ICs9IDE7Ci0JCQl9CQotCQl9Ci0JfQotCXNydW5fYXJndltpbmRleF0gPSBOVUxMOyAvKiBtYXJrIHRoZSBlbmQgb2Ygc3J1bl9hcmd2W10gKi8KLQotCXNydW5fYXJnYyA9IGluZGV4OwkKLQlkZWJ1Z19sb2cobG9nZnAsICJzcnVuIGNtZDoiKTsKLQlmb3IgKGkgPSAwOyBpIDwgc3J1bl9hcmdjOyBpKyspIAotCQlkZWJ1Z19sb2cobG9nZnAsIiVzICIsc3J1bl9hcmd2W2ldKTsKLQlkZWJ1Z19sb2cobG9nZnAsICJcbiIpOwotCi0KLQkvKgotCSAqIEZJWE1FOiBCeSBub3csIGRlYnVnIGpvYiBpcyBub3Qgc3VwcG9ydGVkLgotCSAqLwotCWlmIChkZWJ1ZykgewotCQlpZiAoYXR0YWNoX21vZGUpIHsKLQkJCXJldCA9ICBoYW5kbGVfYXR0YWNoX2RlYnVnKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBoYW5kbGVfZGVidWcoKTsKLQkJfQkKLQl9IGVsc2UgewotCQlwdHBfam9iIGo7Ci0JCWouZGVidWcgPSBkZWJ1ZzsKLQkJai5wdHBfam9iaWQgPSBwdHBpZDsgLyogbW9kZWwgZWxlbWVudCBpZCBnZW5lcmF0ZWQgYnkgcHJveHkgYWdlbnQgKi8KLQkJai5udW1fcHJvY3MgPSBudW1fcHJvY3M7Ci0JCWFsbG9jYXRlX2FuZF9sYXVuY2hfam9iKHRyYW5zX2lkLCBqb2JzdWJpZCwgJmosICZvcHQsIHNydW5fYXJnYywgc3J1bl9hcmd2KTsKLQkJZnJlZV9vcHQoJm9wdCk7Ci0JCWZyZWVfc3J1bl9hcmd2KHNydW5fYXJnYyxzcnVuX2FyZ3YpOwotCX0KLQotCXJldHVybiBQUk9YWV9SRVNfT0s7Ci19CQkKLQotLyogCi0gKiBDYW5jZWwgam9iLCBnaXZlbiBwdHAgam9iaWQgKG5vdCBzbHVybSBqb2JpZCkuCi0gKi8KLWludAotU0xVUk1fVGVybWluYXRlSm9iKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQJCQlpOwotCWludCAJCXB0cF9qb2JpZCA9IC0xOwotCXB0cF9qb2IgKiAJajsKLQotCQotCWlmIChwcm94eV9zdGF0ZSAhPSBTVEFURV9SVU5OSU5HKSB7Ci0JCXNlbmRFcnJvckV2ZW50KHRyYW5zX2lkLCBSVEVWX0VSUk9SX0pPQiwgIm11c3QgY2FsbCBJTklUIGZpcnN0Iik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7Ci0JCWlmIChwcm94eV90ZXN0X2F0dHJpYnV0ZShKT0JfSURfQVRUUiwgYXJnc1tpXSkpIHsKLQkJCXB0cF9qb2JpZCA9IHByb3h5X2dldF9hdHRyaWJ1dGVfdmFsdWVfaW50KGFyZ3NbaV0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocHRwX2pvYmlkIDwgMCkgewotCQlzZW5kSm9iVGVybWluYXRlRXJyb3JFdmVudCh0cmFuc19pZCwgcHRwX2pvYmlkLCAiaW52YWxpZCBqb2JpZCAiKTsKLQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQl9Ci0KLQkvKiBjb252ZXJ0IHB0cCBqb2JpZCB0byBzbHVybSBqb2JpZCAqLwotCWlmICgoaiA9IGZpbmRfam9iKHB0cF9qb2JpZCwgUFRQX0pPQklEKSkgIT0gTlVMTCkgewotCQkvKgotCQkgKiBLaWxsIGFsbCBqb2Igc3RlcHMgYW5kIHJlcXVlc3QgaW90aHJlYWQgdG8gZXhpdC4KLQkJICogUmVtb3Zpbmcgam9iIHN0cnVjdHVyZSBmcm9tIHRoZSBnbG9iYWwgam9iIGxpc3QgCi0JCSAqIGlzIGxlZnQgdG8gcHVyZ2VfZ2xvYmFsX2pvYmxpc3QoKS4KLQkJICovCi0JCWtpbGwoai0+c3J1bl9waWQsIFNJR0tJTEwpOwotCQlqLT5pb3RocmVhZF9leGl0X3JlcSA9IHRydWU7Ci0JCWlmIChqLT5uZWVkX2FsbG9jKSB7Ci0JCQlzbHVybV9raWxsX2pvYihqLT5zbHVybV9qb2JpZCwgU0lHS0lMTCwgMCk7IAotCQl9CQotCX0gCi0Jc2VuZE9LRXZlbnQodHJhbnNfaWQpOwotCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotLyoKLSAqIEVuYWJsZSBzZW5kaW5nIG9mIGV2ZW50cy4KLSAqIFRoZSBmaXJzdCBtc2cgdGhhdCBtdXN0IGJlIHNlbnQgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbW9kZWwuIAotICogVGhpcyBjb21wcmlzZXMgTkVXIG1vZGVsIGVsZW1lbnQgZXZlbnRzCi0gKiAoTmV3TWFjaGluZSwgTmV3Tm9kZSwgTmV3UXVldWUpIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIG1vZGVsLiAKLSAqIE9uY2UgdGhlIG1vZGVsIGRlc2NyaXB0aW9uIGhhcyBiZWVuIHNlbnQsIG1vZGVsIGNoYW5nZSBldmVudHMgd2lsbCBiZSBzZW50IGFzIGRldGVjdGVkLgotICovCi1pbnQKLVNMVVJNX1N0YXJ0RXZlbnRzKGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQgCQkJbnVtX21hY2hpbmVzOwotCWludAkJCQltOwotCXB0cF9tYWNoaW5lICoJbWFjaDsKLQlpbnQJCQkJbnVtX25vZGVzOwotCQotCWRlYnVnX2xvZyhsb2dmcCwgIlNMVVJNX1N0YXJ0RXZlbnRzICglZCk6XG4iLCB0cmFuc19pZCk7IAotCi0JaWYgKHByb3h5X3N0YXRlICE9IFNUQVRFX1JVTk5JTkcpIHsKLQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfU0xVUk1fSU5JVCwgIk11c3QgY2FsbCBJTklUIGZpcnN0Iik7Ci0JCXJldHVybiBQUk9YWV9SRVNfT0s7Ci0JfQotCi0JLyogTm9kZUNoYW5nZSwgSm9iQ2hhbmdlIGV2ZW50IHVzZSBnVHJhbnNJRCBhcyBUSUQgdG8gbWF0Y2ggU1RBUlRfRVZFTlRTIGNtZCAqLwotCWdUcmFuc0lEID0gdHJhbnNfaWQ7Ci0JCi0JLyoKLQkgKiBGSVhNRTogaG93IHRvIGhhbmRsZSBwYXJ0aXRpb24gaW5mb3JtYXRpb24gaW4gU0xVUk0/Ci0JICovCi0JbnVtX21hY2hpbmVzID0gZ2V0X251bV9tYWNoaW5lcygpOwotCWZvcihtID0gMDsgbSA8IG51bV9tYWNoaW5lczsgbSsrKSB7Ci0JCW1hY2ggPSBuZXdfbWFjaGluZSgpOwotCQkvKiBOZXdNYWNoaW5lIGVsZW1lbnQgKi8KLQkJc2VuZE5ld01hY2hpbmVFdmVudCh0cmFuc19pZCwgbWFjaC0+aWQsIGdldF9tYWNoaW5lX25hbWUobSkpOwotCQludW1fbm9kZXMgPSBnZXRfbnVtX25vZGVzKG1hY2gtPmlkKTsKLQkJaWYoY3JlYXRlX25vZGVfbGlzdChtYWNoKSkgewotCQkJc2VuZEVycm9yRXZlbnQodHJhbnNfaWQsIFJURVZfRVJST1JfTkFUVFIsICJGYWlsIHRvIGNyZWF0ZSBub2RlbGlzdCIpOwotCQkJcmV0dXJuIFBST1hZX1JFU19PSzsKLQkJfQotCQkvKiBOZXdOb2RlIGVsZW1lbnQgKi8KLQkJc2VuZE5ld05vZGVFdmVudCh0cmFuc19pZCwgbWFjaC0+aWQsIG1hY2gpOwotCX0KLQkvKiBOZXdRdWV1ZSBlbGVtZW50ICovCi0Jc2VuZE5ld1F1ZXVlRXZlbnQodHJhbnNfaWQpOwotCi0JLyogRnJvbSBub3cgb24sIGpvYiBzdGF0ZSBhbmQgbm9kZSBzdGF0ZSB1cGRhdGUgbXNnIGNhbiBiZSBzZW50ICovCi0JZW5hYmxlX3N0YXRlX3VwZGF0ZSA9IHRydWU7Ci0JCi0JcmV0dXJuIFBST1hZX1JFU19PSzsKLX0KLQotCi0vKgotICogQ29tcGl0YWJsZSBpbnRlcmZhY2UuCi0gKiBQcm94eSBub3QgYWxsb3dlZCB0byBzdG9wIFNMVVJNIHJtcy4KLSAqLwotaW50Ci1TTFVSTV9RdWl0KGludCB0cmFuc19pZCwgaW50IG5hcmdzLCBjaGFyICoqYXJncykKLXsKLQlpbnQgb2xkX3N0YXRlID0gcHJveHlfc3RhdGU7Ci0JCi0JZGVidWdfbG9nKGxvZ2ZwLCAiU0xVUk1fUXVpdCBjYWxsZWRcbiIpOwotCQotCXByb3h5X3N0YXRlID0gU1RBVEVfU0hVVFRJTkdfRE9XTjsKLQlpZiAob2xkX3N0YXRlID09IFNUQVRFX1JVTk5JTkcpIAotCQlkb19zbHVybV9zaHV0ZG93bigpOwotCQotCXNlbmRTaHV0ZG93bkV2ZW50KHRyYW5zX2lkKTsKLQkKLQlyZXR1cm4gUFJPWFlfUkVTX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFTkQgT0YgRElTUEFUQ0ggUk9VVElORVMgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEluaXQgam9ic3RhdGVfdXBkYXRlX3RpbWVyLgotICovCi1zdGF0aWMgdm9pZCAKLWluaXRfam9iX3RpbWVyKCkKLXsKLQlnZXR0aW1lb2ZkYXkoJmpvYl91cGRhdGVfdGltZXIsIE5VTEwpOwotCXJldHVybjsKLX0KLQotLyoKLSAqIEluaXQgbm9kZXN0YXRlX3VwZGF0ZV90aW1lci4KLSAqLwotc3RhdGljIHZvaWQgCi1pbml0X25vZGVfdGltZXIoKQotewotCWdldHRpbWVvZmRheSgmbm9kZV91cGRhdGVfdGltZXIsIE5VTEwpOwotCXJldHVybjsKLX0KLQotLyoKLSAqIENoZWNrIGlmIHRpbWVyIGV4cGlyZXMgZ2l2ZW4gdGltZW91dCB2YWx1ZS4KLSAqLwotc3RhdGljIGJvb2wKLXVwZGF0ZV90aW1lb3V0KGludCB0aW1lcl9pZCwgY29uc3QgaW50IHRpbWVvdXQpCi17Ci0Jc3RydWN0IHRpbWV2YWwgKiB0aW1lcjsKLQlzdHJ1Y3QgdGltZXZhbCBub3c7Ci0JaW50IHZhbDsKLQlib29sIHJjID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHRpbWVyX2lkKSB7Ci0JY2FzZSBKT0JfVVBEQVRFX1RJTUVSOgotCQl0aW1lciA9ICZqb2JfdXBkYXRlX3RpbWVyOwotCQlicmVhazsKLQljYXNlIE5PREVfVVBEQVRFX1RJTUVSOgotCQl0aW1lciA9ICZub2RlX3VwZGF0ZV90aW1lcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOyAKLQl9Ci0JZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOwotCXZhbCA9IChub3cudHZfc2VjIC0gdGltZXItPnR2X3NlYykgKiAxMDAwMDAwICsgKG5vdy50dl91c2VjIC0gdGltZXItPnR2X3VzZWMpIC0gdGltZW91dDsKLQlpZiAodmFsID49IDApIHsKLQkJLyogdXBkYXRlIHRpbWVyICovCi0JCWdldHRpbWVvZmRheSh0aW1lciwgTlVMTCk7Ci0JCXJjID0gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBXcmFwcGVyIHJvdXRpbmUgdG8gY2hlY2sgam9iX3VwZGF0ZV90aW1lci4KLSAqLwotc3RhdGljIGJvb2wKLWpvYl91cGRhdGVfdGltZW91dCgpCi17Ci0JcmV0dXJuIHVwZGF0ZV90aW1lb3V0KEpPQl9VUERBVEVfVElNRVIsIEpPQl9VUERBVEVfVElNRU9VVCk7Ci19Ci0KLS8qCi0gKiBXcmFwcGVyIHJvdXRpbmUgdG8gY2hlY2sgbm9kZV91cGRhdGVfdGltZXIuCi0gKi8KLXN0YXRpYyBib29sCi1ub2RlX3VwZGF0ZV90aW1lb3V0KCkKLXsKLQlyZXR1cm4gdXBkYXRlX3RpbWVvdXQoTk9ERV9VUERBVEVfVElNRVIsIE5PREVfVVBEQVRFX1RJTUVPVVQpOwotfQotCi0vKgotICogVXBkYXRlIGpvYi9wcm9jZXNzIHN0YXRlIGFuZCBzZW5kIHN0YXRlIENIQU5HRSB0byB1aS4KLSAqLwotc3RhdGljIHZvaWQgCi11cGRhdGVfam9iX3N0YXRlKGludCBzbHVybV9qb2JpZCkKLXsKLQlpbnQgaTsKLQlpbnQgZXJyY29kZTsKLQlib29sIGpvYl9maW5kOwotCXB0cF9qb2IgKiBqOwotCWpvYl9pbmZvX21zZ190ICogbXNnID0gTlVMTDsKLQotCWVycmNvZGUgPSBzbHVybV9sb2FkX2pvYnMoKHRpbWVfdClOVUxMLCAmbXNnLCBTSE9XX0FMTCk7Ci0JaWYgKGVycmNvZGUpIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCJzbHVybV9sb2FkX2pvYnMgZXJyb3IiKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoU2V0TGlzdChnSm9iTGlzdCk7IChqID0gKHB0cF9qb2IgKilHZXRMaXN0RWxlbWVudChnSm9iTGlzdCkpICE9IE5VTEw7KSB7Ci0JCWlmIChzbHVybV9qb2JpZCA+IC0xKSB7IAotCQkJaWYgKGotPnNsdXJtX2pvYmlkICE9IHNsdXJtX2pvYmlkKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWpvYl9maW5kID0gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBtc2ctPnJlY29yZF9jb3VudDsgaSsrKSB7Ci0JCQlpZiAoai0+c2x1cm1fam9iaWQgPT0gKG1zZy0+am9iX2FycmF5W2ldKS5qb2JfaWQpIHsKLQkJCQlqb2JfZmluZCA9IHRydWU7Ci0JCQkJaWYgKGotPnN0YXRlICE9IChtc2ctPmpvYl9hcnJheVtpXSkuam9iX3N0YXRlKSB7IC8qc3RhdGUgY2hhbmdlKi8KLQkJCQkJai0+c3RhdGUgPSAobXNnLT5qb2JfYXJyYXlbaV0pLmpvYl9zdGF0ZTsKLQkJCQkJLyogCi0JCQkJCSAqIFNMVVJNIGRvZXNuJ3QgcHJvdmlkZSBwcm9jZXNzIHN0YXRlLgotCQkJCQkgKiBGb3JjZSBwcm9jZXNzIHN0YXRlIGNoYW5ncyB3aXRoIGpvYiBzdGF0ZS4gCi0JCQkJCSAqLwotCQkJCQlzZW5kUHJvY2Vzc1N0YXRlQ2hhbmdlRXZlbnQoZ1RyYW5zSUQsIGosIGpvYnN0YXRlX3RvX3N0cmluZyhqLT5zdGF0ZSkpOwotCQkJCQlzZW5kSm9iU3RhdGVDaGFuZ2VFdmVudChnVHJhbnNJRCwgai0+cHRwX2pvYmlkLCBqb2JzdGF0ZV90b19zdHJpbmcoai0+c3RhdGUpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9CQotCQl9Ci0JCWlmICgham9iX2ZpbmQpIHsgCi0JCQkvKgotCQkJICogam9iIG5vdCBmb3VuZChyYXJlbHkgaGFwcGVucykuCi0JCQkgKiBJbiB0aGlzIGNhc2UsIHNpbXBseSBtYXJrIHRoaXMgam9iIHJlbW92YWJsZS4KLQkJCSAqIFNMVVJNIGtlZXAgdGhlIGluZm9ybWF0aW4gb2YgY29tcGxldGUvZmFpbCBqb2JzIGZvciBNaW5Kb2JBZ2UgKGRlZmF1bHQgdG8gMzAwKSBzZWNvbmRzCi0JCQkgKiBNaW5Kb2JBZ2UgY2FuIGJlIHNldCBpbiBzbHVybS9ldGMvc2x1cm0uY29uZi4KLQkJCSAqLwotCQkJai0+cmVtb3ZhYmxlID0gdHJ1ZTsKLQkJfQotCQlpZiAoc2x1cm1fam9iaWQgPiAtMSkKLQkJCWJyZWFrOwotCX0KLQlzbHVybV9mcmVlX2pvYl9pbmZvX21zZyhtc2cpOwotCi0JcmV0dXJuOwotfQotCi0vKgotICogVXBkYXRlIEFMTCBub2RlcyBzdGF0ZSBhbmQgc2VuZCBzdGF0ZSBDSEFOR0UgdG8gdWkuCi0gKi8KLXZvaWQKLXVwZGF0ZV9ub2RlX3N0YXRlKCkKLXsKLQlpbnQgaTsKLQlwdHBfbm9kZSAqIG5vZGU7Ci0JaW50IGVycmNvZGU7Ci0Jbm9kZV9pbmZvX21zZ190ICogbXNnOwotCXJhbmdlc2V0ICogdW5rbm93bl9zZXQgPSBuZXdfcmFuZ2VzZXQoKTsKLQlyYW5nZXNldCAqIGlkbGVfc2V0ID0gbmV3X3Jhbmdlc2V0KCk7Ci0JcmFuZ2VzZXQgKiBkb3duX3NldCA9IG5ld19yYW5nZXNldCgpOwotCXJhbmdlc2V0ICogYWxsb2NhdGVkX3NldCA9IG5ld19yYW5nZXNldCgpOwotCi0JaWYgKHVua25vd25fc2V0ID09IE5VTEwgfHwgaWRsZV9zZXQgPT0gTlVMTCB8fCBkb3duX3NldCA9PSBOVUxMIHx8IGFsbG9jYXRlZF9zZXQgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOwotCi0JZXJyY29kZSA9IHNsdXJtX2xvYWRfbm9kZSgodGltZV90KU5VTEwsICZtc2csIFNIT1dfQUxMKTsKLQlpZiAoZXJyY29kZSkgewotCQlkZWJ1Z19sb2cobG9nZnAsInNsdXJtX2xvYWRfbm9kZSBlcnJvci5cbiIpOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IG1zZy0+cmVjb3JkX2NvdW50OyBpKyspIHsKLQkJCW5vZGUgPSBmaW5kX25vZGVfYnlfbmFtZShtc2ctPm5vZGVfYXJyYXlbaV0ubmFtZSk7Ci0JCQlpZiAobm9kZS0+c3RhdGUgPT0gbXNnLT5ub2RlX2FycmF5W2ldLm5vZGVfc3RhdGUpCi0JCQkJY29udGludWU7Ci0JCQllbHNlIHsgLyogbm9kZSBzdGF0ZSBjaGFuZ2UgKi8KLQkJCQlub2RlLT5zdGF0ZSA9IG1zZy0+bm9kZV9hcnJheVtpXS5ub2RlX3N0YXRlOwotCQkJCXN3aXRjaCAobXNnLT5ub2RlX2FycmF5W2ldLm5vZGVfc3RhdGUgJiBOT0RFX1NUQVRFX0JBU0UpIHsKLQkJCQljYXNlIE5PREVfU1RBVEVfVU5LTk9XTjoKLQkJCQkJaW5zZXJ0X2luX3Jhbmdlc2V0KHVua25vd25fc2V0LG5vZGUtPmlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOT0RFX1NUQVRFX0RPV046Ci0JCQkJCWluc2VydF9pbl9yYW5nZXNldChkb3duX3NldCxub2RlLT5pZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTk9ERV9TVEFURV9JRExFOgotCQkJCQlpbnNlcnRfaW5fcmFuZ2VzZXQoaWRsZV9zZXQsbm9kZS0+aWQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5PREVfU1RBVEVfQUxMT0NBVEVEOgotCQkJCQlpbnNlcnRfaW5fcmFuZ2VzZXQoYWxsb2NhdGVkX3NldCxub2RlLT5pZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWRlYnVnX2xvZyhsb2dmcCwgInVucmVjb2duaXplZCBub2RlIHN0YXRlXG4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQkKLQkJCX0KLQkJfQkKLQkJCQotCQlpZiAoIUVtcHR5TGlzdCh1bmtub3duX3NldC0+ZWxlbWVudHMpKSB7Ci0JCQlzZW5kTm9kZUNoYW5nZUV2ZW50KGdUcmFuc0lELHJhbmdlc2V0X3RvX3N0cmluZyh1bmtub3duX3NldCksbm9kZXN0YXRlX3RvX3N0cmluZyhOT0RFX1NUQVRFX1VOS05PV04pKTsKLQkJfQotCQlpZiAoIUVtcHR5TGlzdChkb3duX3NldC0+ZWxlbWVudHMpKSB7Ci0JCQlzZW5kTm9kZUNoYW5nZUV2ZW50KGdUcmFuc0lELHJhbmdlc2V0X3RvX3N0cmluZyhkb3duX3NldCksbm9kZXN0YXRlX3RvX3N0cmluZyhOT0RFX1NUQVRFX0RPV04pKTsKLQkJfQotCQlpZiAoIUVtcHR5TGlzdChpZGxlX3NldC0+ZWxlbWVudHMpKSB7Ci0JCQlzZW5kTm9kZUNoYW5nZUV2ZW50KGdUcmFuc0lELHJhbmdlc2V0X3RvX3N0cmluZyhpZGxlX3NldCksbm9kZXN0YXRlX3RvX3N0cmluZyhOT0RFX1NUQVRFX0lETEUpKTsKLQkJfQotCQlpZiAoIUVtcHR5TGlzdChhbGxvY2F0ZWRfc2V0LT5lbGVtZW50cykpIHsKLQkJCXNlbmROb2RlQ2hhbmdlRXZlbnQoZ1RyYW5zSUQscmFuZ2VzZXRfdG9fc3RyaW5nKGFsbG9jYXRlZF9zZXQpLG5vZGVzdGF0ZV90b19zdHJpbmcoTk9ERV9TVEFURV9BTExPQ0FURUQpKTsKLQkJfQotCi0JCXNsdXJtX2ZyZWVfbm9kZV9pbmZvX21zZyhtc2cpOwotCX0KLQotY2xlYW51cDoKLQlpZih1bmtub3duX3NldCkKLQkJZnJlZV9yYW5nZXNldCh1bmtub3duX3NldCk7Ci0JaWYoZG93bl9zZXQpCQotCQlmcmVlX3Jhbmdlc2V0KGRvd25fc2V0KTsKLQlpZihpZGxlX3NldCkJCi0JCWZyZWVfcmFuZ2VzZXQoaWRsZV9zZXQpOwotCWlmIChhbGxvY2F0ZWRfc2V0KQkKLQkJZnJlZV9yYW5nZXNldChhbGxvY2F0ZWRfc2V0KTsKLQotCXJldHVybjsKLX0KLQotCi0vKgotICogc2lnbmFsIGhhbmRsZXIgb2Ygc2x1cm0gcHJveHkuIAotICovCi1SRVRTSUdUWVBFCi1wdHBfc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKLXsKLQlpZiAoc2lnICE9IFNJR0NITEQpICAvKiBwcm94eSBkb2Vzbid0IGV4aXQgb24gU0lHQ0hMRCAqLyAKLQkJcHRwX3NpZ25hbF9leGl0ID0gc2lnOwotfQotCi0vKgotICogQ2xlYW51cCB3b3JrIG9uIHByb3h5IGV4aXRpbmc6Ci0gKiAga2lsbCBzcnVuIHByb2Nlc3MsIHJlbGVhc2Ugam9iIHJlc291cmNlLCAKLSAqCXRlcm1pbmF0ZSBpb190aHJlYWQsYW5kIGZyZWUgc3BhY2UuCi0gKi8KLXN0YXRpYyB2b2lkCi1kZXN0cm95X2dsb2JhbF9qb2JsaXN0KCkKLXsKLQlwdHBfam9iICogajsKLQkKLQlmb3IgKFNldExpc3QoZ0pvYkxpc3QpOyAoaiA9IChwdHBfam9iICopR2V0TGlzdEVsZW1lbnQoZ0pvYkxpc3QpKSAhPSBOVUxMOyApIHsKLQkJaWYgKHNsdXJtX2pvYl9hY3RpdmUoaikpIHsKLQkJCWtpbGwoai0+c3J1bl9waWQsIFNJR0tJTEwpOwotCQkJc2x1cm1fa2lsbF9qb2Ioai0+c2x1cm1fam9iaWQsIFNJR0tJTEwsIDApOwotCQl9CQotCQlpZiAoai0+aW90aHJlYWRfZXhpdCA9PSBmYWxzZSkKLQkJCWotPmlvdGhyZWFkX2V4aXRfcmVxID0gdHJ1ZTsKLQkJUmVtb3ZlRnJvbUxpc3QoZ0pvYkxpc3QsIGopOwotCQlmcmVlX2pvYihqKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1zZXJ2ZXIoY2hhciAqbmFtZSwgY2hhciAqaG9zdCwgaW50IHBvcnQpCi17Ci0JaW50CQkJCXJjID0gMDsKLQlzdHJ1Y3QgdGltZXZhbAl0aW1lb3V0ID0gezAsIDIwMDAwfTsKLQotCWdKb2JMaXN0ID0gTmV3TGlzdCgpOwotCWdNYWNoaW5lTGlzdCA9IE5ld0xpc3QoKTsKLQkKLQlpbml0X2pvYl90aW1lcigpOwotCWluaXRfbm9kZV90aW1lcigpOwotCi0JaWYgKHByb3h5X3N2cl9pbml0KG5hbWUsICZ0aW1lb3V0LCAmaGVscGVyX2Z1bmNzLCAmY29tbWFuZF90YWIsICZzbHVybV9wcm94eSkgIT0gUFJPWFlfUkVTX09LKSB7Ci0JCWRlYnVnX2xvZyhsb2dmcCwgInByb3h5IGZhaWxlZCB0byBpbml0aWFsaXplZFxuIik7IAotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JaWYgKHByb3h5X3N2cl9jb25uZWN0KHNsdXJtX3Byb3h5LCBob3N0LCBwb3J0KSA9PSBQUk9YWV9SRVNfT0spIHsKLQkJZGVidWdfbG9nKGxvZ2ZwLCAicHJveHkgY29ubmVjdGVkXG4iKTsgCi0JCQotCQl3aGlsZSAocHRwX3NpZ25hbF9leGl0ID09IDAgJiYgcHJveHlfc3RhdGUgIT0gU1RBVEVfU0hVVERPV04pIHsKLQkJCWlmIChwcm94eV9zdGF0ZSA9PSBTVEFURV9TSFVUVElOR19ET1dOKSB7Ci0JCQkJcHJveHlfc3RhdGUgPSBTVEFURV9TSFVURE9XTjsKLQkJCX0KLQkJCWlmIChwcm94eV9zdnJfcHJvZ3Jlc3Moc2x1cm1fcHJveHkpICE9IFBST1hZX1JFU19PSykKLQkJCQlicmVhazsKLQkJCS8qIHVwZGF0ZSBqb2IgYW5kIG5vZGUgc3RhdGUgKi8JCi0JCQlpZiAoZW5hYmxlX3N0YXRlX3VwZGF0ZSkgewotCQkJCWlmIChqb2JfdXBkYXRlX3RpbWVvdXQoKSkgIAotCQkJCQl1cGRhdGVfam9iX3N0YXRlKEFMTF9KT0JTVEFURSk7IAotCQkJCWlmIChub2RlX3VwZGF0ZV90aW1lb3V0KCkpIAotCQkJCQl1cGRhdGVfbm9kZV9zdGF0ZSgpOwotCQkJfQotCQkJLyogZGVsZXRlIHJlbW92YWJsZSBqb2IgKi8KLQkJCXB1cmdlX2dsb2JhbF9qb2JsaXN0KCk7Ci0JCX0KLQkJaWYgKHB0cF9zaWduYWxfZXhpdCAhPSAwKSB7Ci0JCQlpZiAocHJveHlfc3RhdGUgIT0gU1RBVEVfU0hVVFRJTkdfRE9XTgotCQkJCSYmIHByb3h5X3N0YXRlICE9IFNUQVRFX1NIVVRET1dOKSB7Ci0JCQkJZG9fc2x1cm1fc2h1dGRvd24oKTsKLQkJCX0KLQkJCQotCQkJZGVzdHJveV9nbG9iYWxfam9ibGlzdCgpOwotCi0JCQkvKiBvdXIgcmV0dXJuIGNvZGUgPSB0aGUgc2lnbmFsIHRoYXQgZmlyZWQgKi8KLQkJCXJjID0gcHRwX3NpZ25hbF9leGl0OwotCQkJZGVidWdfbG9nKGxvZ2ZwLCAicHRwX3NsdXJtX3Byb3h5IHRlcm1pbmF0ZWQgYnkgc2lnbmFsIFslZF1cbiIsIHB0cF9zaWduYWxfZXhpdCk7Ci0JCX0KLQl9IGVsc2UgCi0JCWRlYnVnX2xvZyhsb2dmcCwgInByb3h5IGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsgCi0JCi0JcHJveHlfc3ZyX2ZpbmlzaChzbHVybV9wcm94eSk7Ci0JCi0JcmV0dXJuIHJjOwotfQotCi0KLS8qCi0gKiBFbnRyeSByb3V0aW5lCi0gKi8KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCWludCAJY2g7Ci0JaW50CQlwb3J0ID0gUFJPWFlfVENQX1BPUlQ7Ci0JY2hhciAqCWhvc3QgPSBERUZBVUxUX0hPU1Q7Ci0JY2hhciAqCXByb3h5X3N0ciA9IERFRkFVTFRfUFJPWFk7Ci0JaW50CQlyYzsKLQkKLQl3aGlsZSAoKGNoID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6cDpoOiIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gLTEpeyAKLQkJc3dpdGNoIChjaCkgewotCQljYXNlICdQJzoKLQkJCXByb3h5X3N0ciA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCXBvcnQgPSAoaW50KXN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKLQkJCWJyZWFrOwotCQljYXNlICdoJzoKLQkJCWhvc3QgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLCAiJXMgWy0tcHJveHk9cHJveHldIFstLWhvc3Q9aG9zdF9uYW1lXSBbLS1wb3J0PXBvcnRdIFxuIiwgYXJndlswXSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0JCi0KLQkvL3B1dGVudigiUFRQX1NMVVJNX1BST1hZX0xPR0RJUj0kSE9NRS9sb2ciKTsKLQlsb2dmcCA9IGluaXRfbG9nZnAoKTsKLQotCS8qIAotCSAqIHNpZ25hbCBjYW4gaGFwcGVuIGFueSB0aW1lIGFmdGVyIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHNvCi0JICogbWFrZSBzdXJlIHdlIGNhdGNoIGl0LgotCSAqLwotCXB0cF9zaWduYWxfZXhpdCA9IDA7Ci0JCi0JLyogc2V0dXAgc2lnbmFsIGhhbmRsZXJzICovCi0JeHNpZ25hbChTSUdJTlQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JeHNpZ25hbChTSUdIVVAsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JeHNpZ25hbChTSUdJTEwsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JeHNpZ25hbChTSUdTRUdWLCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotCXhzaWduYWwoU0lHVEVSTSwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQl4c2lnbmFsKFNJR1FVSVQsIHB0cF9zaWduYWxfaGFuZGxlcik7Ci0JeHNpZ25hbChTSUdBQlJULCBwdHBfc2lnbmFsX2hhbmRsZXIpOwotCXhzaWduYWwoU0lHQ0hMRCwgcHRwX3NpZ25hbF9oYW5kbGVyKTsKLQkKLQlyYyA9IHNlcnZlcihwcm94eV9zdHIsIGhvc3QsIHBvcnQpOwotCQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvLmNsYXNzcGF0aCBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxODE0Zi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9wdHAvcm0vcmVtb3RlL2NvcmUvKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvcm0vcmVtb3RlL3VpLyoiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLy5wcm9qZWN0IGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxMmJlZC4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWk8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2NGNjYy4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQ0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aTtzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLkFjdGl2YXRvcg0KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcg0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLA0KLSBvcmcuZWNsaXBzZS5wdHAuY29yZSwNCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aSwNCi0gb3JnLmVjbGlwc2UucHRwLnV0aWxzLnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsDQotIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlDQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkucHJlZmVyZW5jZXMNCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcywNCi0gb3JnLmVjbGlwc2UucHRwLmNvcmUuZWxlbWVudHMsDQotIG9yZy5lY2xpcHNlLnB0cC5jb3JlLmVsZW1lbnRzLmF0dHJpYnV0ZXMsDQotIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucywNCi0gb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5wdHAucmVtb3RlLmNvcmUuZXhjZXB0aW9uLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLA0KLSBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLndpemFyZHMsDQotIG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9hYm91dC5odG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA2ZjNhLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPg0KLSANCi08cD5BcHJpIDE0LCAyMDA5PC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy48L3A+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvYnVpbGQucHJvcGVydGllcyBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1Y2Y4Ni4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYmluLyxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4NjMzMi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSAjIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IFNjaG9vbCBvZiBDb21wdXRlcixOYXRpb25hbCBVbml2ZXJzaXR5IA0KLSAjIG9mIERlZmVuc2UgVGVjaG5vbG9neSxQLlIuQ2hpbmEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbQ0KLSAjIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIA0KLSAjIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sDQotICMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAjIENvbnRyaWJ1dG9yczoNCi0gIyBTY2hvb2wgb2YgQ29tcHV0ZXIgLSA2MDUgc3RhZmYgcm9vbQ0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1wbHVnaW5OYW1lPVBUUCBTbHVybSBVSQ0KLXBsdWdpblByb3ZpZGVyPUVjbGlwc2Uub3JnDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9wbHVnaW4ueG1sIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWFkZDUyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/Pg0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPg0KLSAgICAgIDxwYWdlDQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC51aS5wcmVmZXJlbmNlcy5ybVByZWZlcmVuY2VzUGFnZSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLnByZWZlcmVuY2VzLlNMVVJNUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zbHVybS51aS5wcmVmZXJlbmNlcy5PTVBJUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgbmFtZT0iU0xVUk0iPg0KLSAgICAgIDwvcGFnZT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC51aS5ybUNvbmZpZ3VyYXRpb25XaXphcmRzIj4NCi0gICAgICA8Y29uZmlndXJhdGlvbldpemFyZA0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkud2l6YXJkcy5TTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnNsdXJtLnVpLmNvbmZpZ3VyYXRpb25XaXphcmQiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnB0cC5sYXVuY2gucm1MYXVuY2hDb25maWd1cmF0aW9ucyI+DQotICAgICAgPGxhdW5jaENvbmZpZ3VyYXRpb24NCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbi5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5zbHVybS51aS5sYXVuY2hDb25maWd1cmF0aW9uIi8+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL0FjdGl2YXRvci5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU3ZGE5Li4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLlNMVVJNUHJlZmVyZW5jZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkiOyAvLyROT04tTkxTLTEkDQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsNCi0JDQotCS8qKg0KLQkgKiBUaGUgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBY3RpdmF0b3IoKSB7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCVNMVVJNUHJlZmVyZW5jZU1hbmFnZXIuaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuDQotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aA0KLQkgKg0KLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsNCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL21lc3NhZ2VzL01lc3NhZ2VzLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNWMwMS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5tZXNzYWdlczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX25hbWU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb247DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8wOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzI7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8zOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl82Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzg7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl85Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTA7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZWZhdWx0QnV0dG9uOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Jyb3dzZUJ1dHRvbjsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9wYXRoOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2FyZ3VtZW50czsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3JfbXNnOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX251bVByb2NzSW52YWxpZDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV90aW1lTGltaXRJbnZhbGlkOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9ncm91cF9zbHVybWQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUHJlZmVyZW5jZXNQYWdlX3NsdXJtZEZpbGVfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2VfU2VsZWN0X1NMVVJNZF9GSUxFOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9JbmNvcnJlY3RfU0xVUk1kX2ZpbGU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUHJlZmVyZW5jZXNQYWdlX3NsdXJtZEFyZ3NfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2Vfc2x1cm1kRnVsbF90ZXh0Ow0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9ncm91cF9wcm94eTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2Vfc2x1cm1TZXJ2ZXJfdGV4dDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2VfU2VsZWN0X1NMVVJNX1BST1hZX0ZJTEU7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNMVVJNUHJlZmVyZW5jZXNQYWdlX0luY29ycmVjdF9zZXJ2ZXJfZmlsZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0xVUk1QcmVmZXJlbmNlc1BhZ2VfbWFudWFsOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTTFVSTVByZWZlcmVuY2VzUGFnZV9icm93c2VCdXR0b247DQotCQ0KLQlzdGF0aWMgew0KLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgew0KLQkJLy8gUHJldmVudCBpbnN0YW5jZXMuDQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL21lc3NhZ2VzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkNWE4Mi4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvbWVzc2FnZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZT1TTFVSTSBQcm94eSBDb25maWd1cmF0aW9uDQotU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZT1TTFVSTSBQcm94eSBDb25maWd1cmF0aW9uDQotU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25uZWN0IHRvIGFuIFNMVVJNIHByb3h5IHNlcnZlcg0KLVNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl8wPU51bWJlciBvZiBQcm9jZXNzZXMoLW4pOiANCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMT1UaW1lIExpbWl0KC10KToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTA9UGxlYXNlIGlucHV0IHRoZSBsaW1pdCg+PTEpIG9mIHJ1bm5pbmcgdGltZShtaW51dGVzKVwhDQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzI9UGFydGF0aW9uIFJlcXVlc3RlZCgtcCk6DQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzM9Sm9iIFR5cGUoLS1qb2J0eXBlKToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfND10cnVlDQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzU9Sm9iIElvIExhYmVsKC1sKToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNj10cnVlDQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzc9Sm9iIFZlcmJvc2UgTW9kZSgtdik6DQotU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzg9Sm9iIE5vZGVsaXN0KC13KToNCi1TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfOT1QbGVhc2UgaW5wdXQgdGhlIGludGVnZXIgbnVtYmVyKD49MSkgb2YgcHJvY2Vzc2VzXCENCi0NCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX25hbWU9U0xVUk1EIENvbmZpZ3VyYXRpb24NCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlPVNMVVJNRCBDb25maWd1cmF0aW9uDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1FbnRlciBpbmZvcm1hdGlvbiB0byBjb25maWd1cmUgU0xVUk1EDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZWZhdWx0QnV0dG9uPVVzZSBkZWZhdWx0IHNldHRpbmdzDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9icm93c2VCdXR0b249QnJvd3NlDQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9wYXRoPVBhdGggdG8gU0xVUk1EOg0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYXJndW1lbnRzPUV4dHJhIFNMVVJNRCBhcmd1bWVudHM6DQotU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkPUludmFsaWQgU0xVUk1EIHBhdGgNCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdD1TZWxlY3QgU0xVUk1EIGV4ZWN1dGFibGUNCi1TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3I9Q29ubmVjdGlvbiBFcnJvcg0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2c9Q291bGQgbm90IG9wZW4gY29ubmVjdGlvbg0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbnVtUHJvY3NJbnZhbGlkPQ0KLVNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGltZUxpbWl0SW52YWxpZD0NCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9ncm91cF9zbHVybWQ9T3BlbiBSdW50aW1lIEVudmlyb25tZW50IERhZW1vbg0KLVNMVVJNUHJlZmVyZW5jZXNQYWdlX3NsdXJtZEZpbGVfdGV4dD1TTFVSTWQgZmlsZToNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9TZWxlY3RfU0xVUk1kX0ZJTEU9U2VsZWN0IFNMVVJNZCBmaWxlDQotU0xVUk1QcmVmZXJlbmNlc1BhZ2VfSW5jb3JyZWN0X1NMVVJNZF9maWxlPUludmFsaWQgU0xVUk0gZGFlbW9uIGZpbGUNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9zbHVybWRBcmdzX3RleHQ9U0xVUk1kIGFyZ3VtZW50czoNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9zbHVybWRGdWxsX3RleHQ9U0xVUk1kIHJ1biBjb21tYW5kOg0KLVNMVVJNUHJlZmVyZW5jZXNQYWdlX2dyb3VwX3Byb3h5PVNsdXJtIFBUUCBQcm94eSBTZXJ2ZXINCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9zbHVybVNlcnZlcl90ZXh0PVNMVVJNfFBUUCBwcm94eSBzZXJ2ZXIgZmlsZToNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9TZWxlY3RfU0xVUk1fUFJPWFlfRklMRT1TZWxlY3QgU0xVUk18UFRQIFByb3h5IHNlcnZlciBmaWxlDQotU0xVUk1QcmVmZXJlbmNlc1BhZ2VfSW5jb3JyZWN0X3NlcnZlcl9maWxlPUludmFsaWQgU0xVUk18UFRQIHByb3h5IHNlcnZlciBmaWxlDQotU0xVUk1QcmVmZXJlbmNlc1BhZ2VfbWFudWFsPUxhdW5jaCBTTFVSTSBzZXJ2ZXIgbWFudWFsbHkNCi1TTFVSTVByZWZlcmVuY2VzUGFnZV9icm93c2VCdXR0b249QnJvd3NlDQotDQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3ByZWZlcmVuY2VzL1NMVVJNUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9wcmVmZXJlbmNlcy9TTFVSTVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGEwMWIuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3ByZWZlcmVuY2VzL1NMVVJNUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5wcmVmZXJlbmNlczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0uY29yZS5TTFVSTVByZWZlcmVuY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0ucmVtb3RlLnVpLnByZWZlcmVuY2VzLkFic3RyYWN0UmVtb3RlUHJlZmVyZW5jZVBhZ2U7DQotDQotcHVibGljIGNsYXNzIFNMVVJNUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlIHsNCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUudWkucHJlZmVyZW5jZXMuQWJzdHJhY3RSZW1vdGVQcmVmZXJlbmNlUGFnZSNnZXRQcmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7DQotCQlyZXR1cm4gU0xVUk1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlcygpOw0KLQl9DQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5wcmVmZXJlbmNlcy5BYnN0cmFjdFJlbW90ZVByZWZlcmVuY2VQYWdlI3NhdmVQcmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7DQotCQlTTFVSTVByZWZlcmVuY2VNYW5hZ2VyLnNhdmVQcmVmZXJlbmNlcygpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvcm1MYXVuY2hDb25maWd1cmF0aW9uL1NMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY1ODYyLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsMjAwOSANCi0gKiBTY2hvb2wgb2YgQ29tcHV0ZXIsIE5hdGlvbmFsIFVuaXZlcnNpdHkgb2YgRGVmZW5zZSBUZWNobm9sb2d5LCBQLlIuQ2hpbmENCi0gKg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogCQkJUGVpY2hhbmcgU2hpIDxwY211dGF0ZXNAMTYzLmNvbT4vPHBjc2hpQG51ZHQuZWR1LmNuPg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLnJtTGF1bmNoQ29uZmlndXJhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLmNvcmUuYXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5hdHRyaWJ1dGVzLkludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUFF1ZXVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5hdHRyaWJ1dGVzLkpvYkF0dHJpYnV0ZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5BYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5STUxhdW5jaFZhbGlkYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLlNMVVJNSm9iQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLkFjdGl2YXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQotDQotcHVibGljIGNsYXNzIFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBleHRlbmRzDQotCQlBYnN0cmFjdFJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIgew0KLQkNCi0JLy9qb2JOdW1Qcm9jZXMNCi0JcHJpdmF0ZSBUZXh0IG51bVByb2NzVGV4dDsNCi0JcHJpdmF0ZSBTdHJpbmcgbnVtUHJvY3NTdHJpbmcgPSAiMSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUl9PRl9QUk9DRVNTRVNfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMDsNCi0JLy9qb2JOdW1Ob2Rlcw0KLQkvKg0KLQlwcml2YXRlIFRleHQgTnVtTm9kZXNUZXh0Ow0KLQlwcml2YXRlIFN0cmluZyBudW1iZXJub2Rlc1N0cmluZyA9ICIyIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9OVU1CRVJfT0ZfTk9ERVNfTEFCRUwgPSAiTnVtYmVyIG9mIE5vZGVzKC1OKTogIjsNCi0JKi8NCi0JLy9qb2JUaW1lTGltaXQNCi0JcHJpdmF0ZSBUZXh0IFRpbWVMaW1pdFRleHQ7DQotCXByaXZhdGUgU3RyaW5nIHRpbWVMaW1pdFN0cmluZyA9ICIyIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1RJTUVfTElNSVRfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMTsNCi0JLy9qb2JQYXJ0aXRpb24NCi0JcHJpdmF0ZSBTdHJpbmcgcGFydGF0aW9uUmVxdWVzdGVkU3RyaW5nID0gIjMiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfUEFSVEFUSU9OX0xBQkVMID0gTWVzc2FnZXMuU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzI7DQotCS8vam9iVHlwZQ0KLQlwcml2YXRlIFN0cmluZyBqb2JUeXBlQ29tYm9TdHJpbmcgPSAibXBpIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX1RZUEVfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfMzsNCi0JLy9qb2JJb0xhYmVsDQotCXByaXZhdGUgU3RyaW5nIGpvYklvU3RyaW5nID0gTWVzc2FnZXMuU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzQ7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfSU9fTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNTsNCi0JLy9qb2JWZXJib3NlDQotCXByaXZhdGUgU3RyaW5nIGpvYlZlcmJvc2VNb2RTdHJpbmcgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9WRVJCT1NFX01PREVfTEFCRUwgPSBNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfNzsNCi0JLy9qb2JOb2RlTGlzdA0KLQlwcml2YXRlIFN0cmluZyBqb2JOb2RlTGlzdFN0cmluZyA9ICJub2RlMCxub2RlMSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPQl9OT0RFX0xJU1RfTEFCRUwgPU1lc3NhZ2VzLlNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYl84Ow0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRklYID0gQWN0aXZhdG9yLlBMVUdJTl9JRCArICIubGF1bmNoQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNUFJPQ1MgPSBBVFRSX1BSRUZJWCArICIubnVtUHJvY3MiOwkgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1OT0RFUyA9IEFUVFJfUFJFRklYICsgIi5udW1Ob2RlcyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElNRUxJTUlUID0gQVRUUl9QUkVGSVggKyAiLnRpbWVMaW1pdCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSk9CUEFSVEFUSU9OID0gQVRUUl9QUkVGSVggKyAiLmpvYnBhcnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSk9CVFlQRSA9IEFUVFJfUFJFRklYICsgIi5qb2J0eXBlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9KT0JJTyA9IEFUVFJfUFJFRklYICsgIi5qb2JpbyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSk9CVkVSQk9TRU1PREUgPSBBVFRSX1BSRUZJWCArICIuam9idmVyYm9zZW1vZGUiOwkgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSTUxhdW5jaFZhbGlkYXRpb24gc3VjY2VzcyA9IG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOw0KLQ0KLQlwdWJsaWMgU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiKElSZXNvdXJjZU1hbmFnZXIgcm0pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjY2FuU2F2ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSkNCi0JICovDQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gY2FuU2F2ZShDb250cm9sIGNvbnRyb2wsIElSZXNvdXJjZU1hbmFnZXIgcm0sIElQUXVldWUgcXVldWUpIHsNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtUHJvY3NBdHRyRGVmID0gZ2V0TnVtUHJvY3NBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKG51bVByb2NzQXR0ckRlZiwgbnVtUHJvY3NTdHJpbmcpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTlVNQkVSX09GX1BST0NFU1NFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCQ0KLQkJLyoNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iTnVtTm9kZXNBdHRyRGVmID0gZ2V0Sm9iTnVtTm9kZXNBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYk51bU5vZGVzQXR0ckRlZiwgbnVtYmVybm9kZXNTdHJpbmcpOw0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ0aGUgaWF0dHIgdmFsdWUgaXM6IitpYXR0cisidGhlIG51bXByb2NzU3RyaW5nIHZhbHVlIGlzOiIrbnVtUHJvY3NTdHJpbmcpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCSovDQotCQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVGltZUxpbWl0QXR0ckRlZiA9IGdldEpvYlRpbWVMaW1pdEF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iVGltZUxpbWl0QXR0ckRlZiwgdGltZUxpbWl0U3RyaW5nKTsJCQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RJTUVfTElNSVRfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkvKg0KLQkJDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlBhcnRhdGlvbkF0dHJEZWYgPSBnZXRKb2JQYXJ0YXRpb25BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlBhcnRhdGlvbkF0dHJEZWYsIHBhcnRhdGlvblJlcXVlc3RlZFN0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJDQotCQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVHlwZUNvbWJvQXR0ckRlZiA9IGdldEpvYlR5cGVDb21ib0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iVHlwZUNvbWJvQXR0ckRlZiwgam9iVHlwZUNvbWJvU3RyaW5nKTsJCQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JJb0F0dHJEZWYgPSBnZXRKb2JJb0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJb1N0cmluZyk7CQkNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9JT19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0JCQ0KLQkJKi8NCi0JCQkJDQotCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbih0cnVlLCAiIik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7DQotCQlHcmlkRGF0YSBnZDsNCi0JCQ0KLQkJZmluYWwgaW50IG51bUNvbHVtbnMgPSAyOw0KLQkJDQotCQlmaW5hbCBDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULkJPUkRFUik7DQotCQlHcmlkTGF5b3V0IGxhdW5jaENvbmZpZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KG51bUNvbHVtbnMsIHRydWUpOw0KLQkJbGF1bmNoQ29uZmlnTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7DQotCQlsYXVuY2hDb25maWdMYXlvdXQubWFyZ2luV2lkdGggPSAwOw0KLQkJbGF1bmNoQ29uZmlnTGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOw0KLQkJY29tcC5zZXRMYXlvdXQobGF1bmNoQ29uZmlnTGF5b3V0KTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHVtbnM7DQotCQljb21wLnNldExheW91dERhdGEoZ2QpOw0KLQkJDQotCQkNCi0JCUxhYmVsIG51bWJlck9mUHJvY2Vzc2VzbkxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsNCi0JCW51bWJlck9mUHJvY2Vzc2VzbkxhYmVsLnNldFRleHQoTlVNQkVSX09GX1BST0NFU1NFU19MQUJFTCk7DQotCQlmaW5hbCBHcmlkRGF0YSBnZF9udW1iZXJPZlByb2Nlc3Nlc25MYWJlbCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAxLCAxKTsNCi0JCWdkX251bWJlck9mUHJvY2Vzc2VzbkxhYmVsLm1pbmltdW1XaWR0aCA9IG51bWJlck9mUHJvY2Vzc2VzbkxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsNCi0JCW51bWJlck9mUHJvY2Vzc2VzbkxhYmVsLnNldExheW91dERhdGEoZ2RfbnVtYmVyT2ZQcm9jZXNzZXNuTGFiZWwpOw0KLQkJDQotCQkNCi0JCW51bVByb2NzVGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7DQotCQludW1Qcm9jc1RleHQuc2V0VGV4dExpbWl0KDEwKTsNCi0JCW51bVByb2NzVGV4dC5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWJfOSk7DQotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCBudW1Db2x1bW5zLTEsIDEpOw0KLQkJZ2QubWluaW11bVdpZHRoID0gbnVtUHJvY3NUZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsNCi0JCW51bVByb2NzVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCS8vIFRlbGwgdGhlIGNsaWVudCBvZiB0aGlzIGR5bmFtaWMgdGFiIHRoYXQgdGhlDQotCQkvLyBjb250ZW50cyBvZiB0aGlzIHRhYiBhcmUgYWZmZWN0ZWQgYnkgdGhlIGNvbnRlbnRzDQotCQkvLyBvZiB0aGlzIHdpZGdldC4NCi0JCW51bVByb2NzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsNCi0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB2YWx1ZSBvZiBudW1Qcm9jc1N0cmluZzoiK251bVByb2NzU3RyaW5nKTsNCi0JCQkJbnVtUHJvY3NTdHJpbmcgPSBudW1Qcm9jc1RleHQuZ2V0VGV4dCgpOw0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIG51bVByb2NzU3RyaW5nMToiK251bVByb2NzU3RyaW5nKTsNCi0JCQkJZmlyZUNvbnRlbnRzQ2hhbmdlZCgpOw0KLQkJCX19KTsNCi0gICAgICAgIC8qDQotCQlmaW5hbCBMYWJlbCBudW1iZXJPZk5vZGVzTGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOw0KLQkJbnVtYmVyT2ZOb2Rlc0xhYmVsLnNldFRleHQoSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCk7DQotDQotCQlOdW1Ob2Rlc1RleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSIHwgU1dULldSQVApOw0KLQkJTnVtTm9kZXNUZXh0LnNldFRleHRMaW1pdCgxMCk7DQotCQlOdW1Ob2Rlc1RleHQuc2V0VG9vbFRpcFRleHQoIlBsZWFzZSBpbnB1dCB0aGUgbnVtYmVyIG9mIG5vZGVzISIpOw0KLQkJZmluYWwgR3JpZERhdGEgZ2RfbnVtTm9kZXNUZXh0ID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7DQotCQlOdW1Ob2Rlc1RleHQuc2V0TGF5b3V0RGF0YShnZF9udW1Ob2Rlc1RleHQpOw0KLQkJLy9OdW1Ob2Rlc1RleHQgICB2YWx1ZQ0KLQkJTnVtTm9kZXNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpew0KLQ0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIG51bWJlcm5vZGVzU3RyaW5nOiIrbnVtYmVybm9kZXNTdHJpbmcpOw0KLQkJCQludW1iZXJub2Rlc1N0cmluZyA9IE51bU5vZGVzVGV4dC5nZXRUZXh0KCk7DQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJUaGUgdmFsdWUgb2YgbnVtYmVybm9kZXNTdHJpbmcxOiIrbnVtYmVybm9kZXNTdHJpbmcpOw0KLQkJCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7DQotCQkJfX0pOw0KLQkJDQotICAgICAgICAqLw0KLQkJZmluYWwgTGFiZWwgdGltZUxpbWl0TGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOw0KLQkJdGltZUxpbWl0TGFiZWwuc2V0VGV4dChKT0JfVElNRV9MSU1JVF9MQUJFTCk7DQotDQotCQlUaW1lTGltaXRUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsNCi0JCVRpbWVMaW1pdFRleHQuc2V0VGV4dExpbWl0KDEwKTsNCi0JCVRpbWVMaW1pdFRleHQuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiXzEwKTsNCi0JCWZpbmFsIEdyaWREYXRhIGdkX3RpbWVMaW1pdFRleHQgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsNCi0JCVRpbWVMaW1pdFRleHQuc2V0TGF5b3V0RGF0YShnZF90aW1lTGltaXRUZXh0KTsNCi0JCS8vVGltZUxpbWl0VGV4dCAgIHZhbHVlDQotCQlUaW1lTGltaXRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpew0KLQ0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgew0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIHRpbWVMaW1pdFN0cmluZzoiK3RpbWVMaW1pdFN0cmluZyk7DQotCQkJCXRpbWVMaW1pdFN0cmluZyA9IFRpbWVMaW1pdFRleHQuZ2V0VGV4dCgpOw0KLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIHRpbWVMaW1pdFN0cmluZzE6Iit0aW1lTGltaXRTdHJpbmcpOw0KLQkJCQlmaXJlQ29udGVudHNDaGFuZ2VkKCk7DQotCQkJfX0pOw0KLQkJLy9wYXJ0YXRpb25SZXF1ZXN0ZWRDb21ibyAgIHZhbHVlDQotCQkvL0pvYklkVGV4dCAgIHZhbHVlDQotCQkvL2pvYlR5cGVDb21ibyAgIHZhbHVlDQotCQkvL0pvYklPTGFibGVUZXh0ICAgdmFsdWUNCi0JCS8vSm9iVmVyYm9zZU1vZGVUZXh0ICB2YWx1ZQ0KLQkJLy9Kb2JOb2RlbGlzdFRleHQgIHZhbHVlDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNnZXRBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFF1ZXVlLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQ0KLQkgKi8NCi0JcHVibGljIElBdHRyaWJ1dGU8Pyw/LD8+W10gZ2V0QXR0cmlidXRlcyhJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlLA0KLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkNCi0JCWludCBudW1Qcm9jcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNUFJPQ1MsIC0xKTsNCi0JCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1Qcm9jc0F0dHJEZWYgPSBnZXROdW1Qcm9jc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKG51bVByb2NzQXR0ckRlZiwgbnVtUHJvY3MpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVbMF07DQotCQl9DQotCQkNCi0JCS8qCQkJCQ0KLQkJaW50IGpvYk51bU5vZGVzID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9OVU1OT0RFUywgLTEpOw0KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB2YWx1ZSBvZiBqb2JOdW1Ob2RlcyBpczogIitqb2JOdW1Ob2Rlcyk7DQotCQ0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjEgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JOdW1Ob2Rlc0F0dHJEZWYgPSBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0cjEgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JOdW1Ob2Rlc0F0dHJEZWYsIGpvYk51bU5vZGVzKTsNCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVGhlIHZhbHVlIG9mIE51bU5vZGVzIGlzOiAiK2lhdHRyMSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVsxXTsNCi0JCX0NCi0JCSovCQkJDQotCQlpbnQgam9iVGltZUxpbWl0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9USU1FTElNSVQsIC0xKTsNCi0JCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIyID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVGltZUxpbWl0QXR0ckRlZiA9IGdldEpvYlRpbWVMaW1pdEF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0cjIgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JUaW1lTGltaXRBdHRyRGVmLCBqb2JUaW1lTGltaXQpOw0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJUaGUgdmFsdWUgb2YgVGltZUxpbWl0IGlzOiAiK2lhdHRyMik7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVsyXTsNCi0JCX0NCi0JCQ0KLQkJLyoJCQkNCi0JCWludCBqb2JQYXJ0YXRpb24gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0pPQlBBUlRBVElPTiwgLTEpOw0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjMgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JQYXJ0YXRpb25BdHRyRGVmID0gZ2V0Sm9iUGFydGF0aW9uQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyMiA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlBhcnRhdGlvbkF0dHJEZWYsIGpvYlBhcnRhdGlvbik7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVszXTsNCi0JCX0NCi0JCQkJCQ0KLQkJaW50IGpvYlR5cGVDb21ibyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSk9CVFlQRSwgLTEpOw0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjMgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUeXBlQ29tYm9BdHRyRGVmID0gZ2V0Sm9iVGltZUxpbWl0QXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyMiA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlR5cGVDb21ib0F0dHJEZWYsIGpvYlR5cGVDb21ibyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVszXTsNCi0JCX0JCQkNCi0JCQkNCi0JCWludCBqb2JJbyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSk9CSU8sIC0xKTsNCi0JCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIzID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iSW9BdHRyRGVmID0gZ2V0Sm9iSW9BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJaWF0dHIzID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJbyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUF0dHJpYnV0ZVszXTsNCi0JCX0NCi0JCSovDQotCQkNCi0JCQ0KLQkJDQotCQlyZXR1cm4gbmV3IElBdHRyaWJ1dGVbXXtpYXR0cixpYXR0cjJ9Ow0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjZ2V0Q29udHJvbCgpDQotCSAqLw0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIGNvbnRyb2w7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sLCBvcmcuZWNsaXBzZS5wdHAucm1zeXN0ZW0uSVJlc291cmNlTWFuYWdlciwgb3JnLmVjbGlwc2UucHRwLmNvcmUuSVBRdWV1ZSwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikNCi0JICovDQotCXB1YmxpYyBSTUxhdW5jaFZhbGlkYXRpb24gaW5pdGlhbGl6ZUZyb20oQ29udHJvbCBjb250cm9sLCBJUmVzb3VyY2VNYW5hZ2VyIHJtLA0KLQkJCUlQUXVldWUgcXVldWUsIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsNCi0JCQ0KLQkJaW50IG51bVByb2NzOw0KLQkJdHJ5IHsNCi0JCQludW1Qcm9jcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNUFJPQ1MsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtUHJvY3NBdHRyRGVmID0gZ2V0TnVtUHJvY3NBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJCW51bVByb2NzVGV4dC5zZXRUZXh0KG51bVByb2NzQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTlVNQkVSX09GX1BST0NFU1NFU19MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIE5VTUJFUl9PRl9QUk9DRVNTRVNfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQludW1Qcm9jc1RleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKG51bVByb2NzKSk7DQotCQkvKg0KLQkJaW50IGpvYk51bU5vZGVzOw0KLQkJdHJ5IHsNCi0JCQlqb2JOdW1Ob2RlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfTlVNTk9ERVMsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iTnVtTm9kZXNBdHRyRGVmID0gZ2V0Sm9iTnVtTm9kZXNBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJCU51bU5vZGVzVGV4dC5zZXRUZXh0KGpvYk51bU5vZGVzQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfTlVNQkVSX09GX05PREVTX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJTnVtTm9kZXNUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhqb2JOdW1Ob2RlcykpOw0KLQkJKi8JCQ0KLQkJaW50IGpvYlRpbWVMaW1pdDsNCi0JCXRyeSB7DQotCQkJam9iVGltZUxpbWl0ID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9USU1FTElNSVQsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVGltZUxpbWl0QXR0ckRlZiA9IGdldEpvYlRpbWVMaW1pdEF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQkJVGltZUxpbWl0VGV4dC5zZXRUZXh0KGpvYlRpbWVMaW1pdEF0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpKTsNCi0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZTEpIHsNCi0JCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9USU1FX0xJTUlUX0xBQkVMICsNCi0JCQkJCQllLmdldE1lc3NhZ2UoKSArICIgOiAiICsgZTEuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RJTUVfTElNSVRfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlUaW1lTGltaXRUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhqb2JUaW1lTGltaXQpKTsNCi0JCS8qCQkNCi0JCWludCBqb2JQYXJ0YXRpb247DQotCQl0cnkgew0KLQkJCWpvYlBhcnRhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEFUVFJfSk9CUEFSVEFUSU9OLCAxKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXRyeSB7DQotCQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlBhcnRhdGlvbkF0dHJEZWYgPSBnZXRKb2JQYXJ0YXRpb25BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJCXBhcnRhdGlvblJlcXVlc3RlZENvbWJvLnNldFRleHQoam9iUGFydGF0aW9uQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1BBUlRBVElPTl9MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJcGFydGF0aW9uUmVxdWVzdGVkQ29tYm8uc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGpvYlBhcnRhdGlvbikpOw0KLQkJaW50IGpvYlR5cGVDb207DQotCQl0cnkgew0KLQkJCWpvYlR5cGVDb20gPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShBVFRSX0pPQlRZUEUsIDEpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iVHlwZUNvbWJvQXR0ckRlZiA9IGdldEpvYlR5cGVDb21ib0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQkJam9iVHlwZUNvbWJvLnNldFRleHQoam9iVHlwZUNvbWJvQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZUFzU3RyaW5nKCkpOw0KLQkJCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKw0KLQkJCQkJCWUuZ2V0TWVzc2FnZSgpICsgIiA6ICIgKyBlMS5nZXRNZXNzYWdlKCkpOw0KLQkJCX0NCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlqb2JUeXBlQ29tYm8uc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGpvYlR5cGVDb20pKTsJDQotCQlpbnQgam9iSW87DQotCQl0cnkgew0KLQkJCWpvYklvID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQVRUUl9KT0JJTywgMSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQl0cnkgew0KLQkJCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JJb0F0dHJEZWYgPSBnZXRKb2JJb0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQkJSm9iSU9MYWJsZVRleHQuc2V0VGV4dChqb2JJb0F0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWVBc1N0cmluZygpKTsNCi0JCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZTEpIHsNCi0JCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9JT19MQUJFTCArDQotCQkJCQkJZS5nZXRNZXNzYWdlKCkgKyAiIDogIiArIGUxLmdldE1lc3NhZ2UoKSk7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfSU9fTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlKb2JJT0xhYmxlVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoam9iSW8pKTsNCi0JCSovDQotCQlyZXR1cm4gc3VjY2VzczsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLmxhdW5jaC51aS5leHRlbnNpb25zLklSTUxhdW5jaENvbmZpZ3VyYXRpb25EeW5hbWljVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpDQotCSAqLw0KLQ0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIGlzVmFsaWQoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwNCi0JCQlJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7DQotCQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gbnVtUHJvY3NBdHRyRGVmID0gZ2V0TnVtUHJvY3NBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKG51bVByb2NzQXR0ckRlZiwgbnVtUHJvY3NTdHJpbmcpOw0KLQkJCWlmIChpYXR0ci5nZXRWYWx1ZSgpIDwgMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9udW1Qcm9jc0ludmFsaWQpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIE5VTUJFUl9PRl9QUk9DRVNTRVNfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQkvKg0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JOdW1Ob2Rlc0F0dHJEZWYgPSBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iTnVtTm9kZXNBdHRyRGVmLCBudW1iZXJub2Rlc1N0cmluZyk7DQotCQkJaWYgKGlhdHRyLmdldFZhbHVlKCkgPCAxKSB7DQotCQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UubnVtYmVybm9kZXNJbnZhbGlkIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCSovDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlRpbWVMaW1pdEF0dHJEZWYgPSBnZXRKb2JUaW1lTGltaXRBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlRpbWVMaW1pdEF0dHJEZWYsIHRpbWVMaW1pdFN0cmluZyk7DQotCQkJaWYgKGlhdHRyLmdldFZhbHVlKCkgPCAxKSB7DQotCQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpbWVMaW1pdEludmFsaWQpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9USU1FX0xJTUlUX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJLyoNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iUGFydGF0aW9uQXR0ckRlZiA9IGdldEpvYlBhcnRhdGlvbkF0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iUGFydGF0aW9uQXR0ckRlZiwgcGFydGF0aW9uUmVxdWVzdGVkU3RyaW5nKTsNCi0JCQlpZiAoaWF0dHIuZ2V0VmFsdWUoKSA8IDEpIHsNCi0JCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIE1lc3NhZ2VzLmdldFN0cmluZygiU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5udW1Qcm9jc0ludmFsaWQiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUeXBlQ29tYm9BdHRyRGVmID0gZ2V0Sm9iVHlwZUNvbWJvQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJCUludGVnZXJBdHRyaWJ1dGUgaWF0dHIgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JUeXBlQ29tYm9BdHRyRGVmLCBqb2JUeXBlQ29tYm9TdHJpbmcpOw0KLQkJCWlmIChpYXR0ci5nZXRWYWx1ZSgpIDwgMSkgew0KLQkJCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLm51bVByb2NzSW52YWxpZCIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9UWVBFX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JJb0F0dHJEZWYgPSBnZXRKb2JJb0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQlJbnRlZ2VyQXR0cmlidXRlIGlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJb1N0cmluZyk7DQotCQkJaWYgKGlhdHRyLmdldFZhbHVlKCkgPCAxKSB7DQotCQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UubnVtUHJvY3NJbnZhbGlkIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX0lPX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJKi8NCi0JCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKHRydWUsICIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWIjcGVyZm9ybUFwcGx5KG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSwgb3JnLmVjbGlwc2UucHRwLnJtc3lzdGVtLklSZXNvdXJjZU1hbmFnZXIsIG9yZy5lY2xpcHNlLnB0cC5jb3JlLklQUXVldWUpDQotCSAqLw0KLQlwdWJsaWMgUk1MYXVuY2hWYWxpZGF0aW9uIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sDQotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0ciA9IG51bGw7DQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIG51bVByb2NzQXR0ckRlZiA9IGdldE51bVByb2NzQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUobnVtUHJvY3NBdHRyRGVmLCBudW1Qcm9jc1N0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBOVU1CRVJfT0ZfUFJPQ0VTU0VTX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9OVU1QUk9DUywgaWF0dHIuZ2V0VmFsdWUoKSk7DQotCQkvKg0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjEgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JOdW1Ob2Rlc0F0dHJEZWYgPSBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQlpYXR0cjEgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JOdW1Ob2Rlc0F0dHJEZWYsIG51bWJlcm5vZGVzU3RyaW5nKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9OVU1CRVJfT0ZfTk9ERVNfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX05VTU5PREVTLCBpYXR0cjEuZ2V0VmFsdWUoKSk7DQotCQkqLw0KLQkJSW50ZWdlckF0dHJpYnV0ZSBpYXR0cjIgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUaW1lTGltaXRBdHRyRGVmID0gZ2V0Sm9iVGltZUxpbWl0QXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyMiA9IG5ldyBJbnRlZ2VyQXR0cmlidXRlKGpvYlRpbWVMaW1pdEF0dHJEZWYsIHRpbWVMaW1pdFN0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfVElNRV9MSU1JVF9MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKEFUVFJfVElNRUxJTUlULCBpYXR0cjIuZ2V0VmFsdWUoKSk7DQotCQkvKg0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JQYXJ0YXRpb25BdHRyRGVmID0gZ2V0Sm9iUGFydGF0aW9uQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iUGFydGF0aW9uQXR0ckRlZiwgcGFydGF0aW9uUmVxdWVzdGVkU3RyaW5nKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9QQVJUQVRJT05fTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX0pPQlBBUlRBVElPTiwgaWF0dHIuZ2V0VmFsdWUoKSk7DQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlR5cGVDb21ib0F0dHJEZWYgPSBnZXRKb2JUeXBlQ29tYm9BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJaWF0dHIgPSBuZXcgSW50ZWdlckF0dHJpYnV0ZShqb2JUeXBlQ29tYm9BdHRyRGVmLCBqb2JUeXBlQ29tYm9TdHJpbmcpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX1RZUEVfTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX1RJTUVMSU1JVCwgaWF0dHIuZ2V0VmFsdWUoKSk7DQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYklvQXR0ckRlZiA9IGdldEpvYklvQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWlhdHRyID0gbmV3IEludGVnZXJBdHRyaWJ1dGUoam9iSW9BdHRyRGVmLCBqb2JJb1N0cmluZyk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfSU9fTEFCRUwgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX0pPQklPLCBpYXR0ci5nZXRWYWx1ZSgpKTsNCi0JCSovDQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihBVFRSX05VTU5PREVTKTsNCi0JCQ0KLQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24odHJ1ZSwgIiIpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC5sYXVuY2gudWkuZXh0ZW5zaW9ucy5JUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiNzZXREZWZhdWx0cyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHksIG9yZy5lY2xpcHNlLnB0cC5ybXN5c3RlbS5JUmVzb3VyY2VNYW5hZ2VyLCBvcmcuZWNsaXBzZS5wdHAuY29yZS5JUFF1ZXVlKQ0KLQkgKi8NCi0JcHVibGljIFJNTGF1bmNoVmFsaWRhdGlvbiBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sDQotCQkJSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBudW1Qcm9jc0F0dHJEZWYgPSBnZXROdW1Qcm9jc0F0dHJEZWYocm0sIHF1ZXVlKTsNCi0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShBVFRSX05VTVBST0NTLCBudW1Qcm9jc0F0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWUoKSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBOVU1CRVJfT0ZfUFJPQ0VTU0VTX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJLyoNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iTnVtTm9kZXNBdHRyRGVmID0gZ2V0Sm9iTnVtTm9kZXNBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9OVU1OT0RFUywgam9iTnVtTm9kZXNBdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlKCkpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX05VTUJFUl9PRl9OT0RFU19MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCSovDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlRpbWVMaW1pdEF0dHJEZWYgPSBnZXRKb2JUaW1lTGltaXRBdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9USU1FTElNSVQsIGpvYlRpbWVMaW1pdEF0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWUoKSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfVElNRV9MSU1JVF9MQUJFTCArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCS8qDQotCQl0cnkgew0KLQkJCUludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGpvYlBhcnRhdGlvbkF0dHJEZWYgPSBnZXRKb2JQYXJ0YXRpb25BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9KT0JQQVJUQVRJT04sIGpvYlBhcnRhdGlvbkF0dHJEZWYuY3JlYXRlKCkuZ2V0VmFsdWUoKSk7DQotCQl9IGNhdGNoIChJbGxlZ2FsVmFsdWVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgUk1MYXVuY2hWYWxpZGF0aW9uKGZhbHNlLCBKT0JfUEFSVEFUSU9OX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBqb2JUeXBlQ29tYm9BdHRyRGVmID0gZ2V0Sm9iVHlwZUNvbWJvQXR0ckRlZihybSwgcXVldWUpOw0KLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKEFUVFJfSk9CVFlQRSwgam9iVHlwZUNvbWJvQXR0ckRlZi5jcmVhdGUoKS5nZXRWYWx1ZSgpKTsNCi0JCX0gY2F0Y2ggKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG5ldyBSTUxhdW5jaFZhbGlkYXRpb24oZmFsc2UsIEpPQl9UWVBFX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQkNCi0JCXRyeSB7DQotCQkJSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gam9iSW9BdHRyRGVmID0gZ2V0Sm9iSW9BdHRyRGVmKHJtLCBxdWV1ZSk7DQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoQVRUUl9KT0JJTywgam9iSW9BdHRyRGVmLmNyZWF0ZSgpLmdldFZhbHVlKCkpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbFZhbHVlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IFJNTGF1bmNoVmFsaWRhdGlvbihmYWxzZSwgSk9CX0lPX0xBQkVMICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQkNCi0JCSovDQotCQlyZXR1cm4gc3VjY2VzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgam9iIGxhdW5jaCBhdHRyaWJ1dGUNCi0JICogDQotCSAqIEBwYXJhbSBybQ0KLQkgKiBAcGFyYW0gcXVldWUNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJpdmF0ZSBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXROdW1Qcm9jc0F0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuZ2V0TnVtYmVyT2ZQcm9jZXNzZXNBdHRyaWJ1dGVEZWZpbml0aW9uKCk7DQotCX0NCi0JcHJpdmF0ZSBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRKb2JOdW1Ob2Rlc0F0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIFNMVVJNSm9iQXR0cmlidXRlcy5nZXROdW1iZXJPZk5vZGVzQXR0cmlidXRlRGVmaW5pdGlvbigpOw0KLQl9DQotCXByaXZhdGUgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0Sm9iVGltZUxpbWl0QXR0ckRlZihJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7DQotCQlyZXR1cm4gU0xVUk1Kb2JBdHRyaWJ1dGVzLmdldFRpbWVMaW1pdEF0dHJpYnV0ZURlZmluaXRpb24oKTsNCi0JfQ0KLQkvKg0KLQlwcml2YXRlIEludGVnZXJBdHRyaWJ1dGVEZWZpbml0aW9uIGdldEpvYlBhcnRhdGlvbkF0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuZ2V0Sm9iUGFydGF0aW9uQXR0cmlidXRlRGVmaW5pdGlvbigpOw0KLQl9DQotCXByaXZhdGUgSW50ZWdlckF0dHJpYnV0ZURlZmluaXRpb24gZ2V0Sm9iVHlwZUNvbWJvQXR0ckRlZihJUmVzb3VyY2VNYW5hZ2VyIHJtLCBJUFF1ZXVlIHF1ZXVlKSB7DQotCQlyZXR1cm4gSm9iQXR0cmlidXRlcy5nZXRKb2JUeXBlQ29tYm9BdHRyaWJ1dGVEZWZpbml0aW9uKCk7DQotCX0NCi0JcHJpdmF0ZSBJbnRlZ2VyQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRKb2JJb0F0dHJEZWYoSVJlc291cmNlTWFuYWdlciBybSwgSVBRdWV1ZSBxdWV1ZSkgew0KLQkJcmV0dXJuIEpvYkF0dHJpYnV0ZXMuZ2V0Sm9iSW9BdHRyaWJ1dGVEZWZpbml0aW9uKCk7DQotCX0NCi0JKi8NCi0JLy9uZWVkIHRvIG1vZGlmeSBKb2JBdHRyaWJ1dGVzLmphdmENCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS9ybUxhdW5jaENvbmZpZ3VyYXRpb24vU0xVUk1STUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWJjM2UuLjAwMDAwMDAKLS0tIGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3JtTGF1bmNoQ29uZmlndXJhdGlvbi9TTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA4LDIwMDkgDQotICogU2Nob29sIG9mIENvbXB1dGVyLCBOYXRpb25hbCBVbml2ZXJzaXR5IG9mIERlZmVuc2UgVGVjaG5vbG9neSwgUC5SLkNoaW5hDQotICoNCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqIAkJCVBlaWNoYW5nIFNoaSA8cGNtdXRhdGVzQDE2My5jb20+LzxwY3NoaUBudWR0LmVkdS5jbj4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS5ybUxhdW5jaENvbmZpZ3VyYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAuY29yZS5lbGVtZW50cy5JUmVzb3VyY2VNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAubGF1bmNoLnVpLmV4dGVuc2lvbnMuSVJNTGF1bmNoQ29uZmlndXJhdGlvbkR5bmFtaWNUYWI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS5jb3JlLnJtc3lzdGVtLlNMVVJNUmVzb3VyY2VNYW5hZ2VyOw0KLQ0KLXB1YmxpYyBjbGFzcyBTTFVSTVJNTGF1bmNoQ29uZmlndXJhdGlvbkZhY3RvcnkgZXh0ZW5kcw0KLQkJQWJzdHJhY3RSTUxhdW5jaENvbmZpZ3VyYXRpb25GYWN0b3J5IHsNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYiBkb0NyZWF0ZShJUmVzb3VyY2VNYW5hZ2VyIHJtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IFNMVVJNUk1MYXVuY2hDb25maWd1cmF0aW9uRHluYW1pY1RhYihybSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVJlc291cmNlTWFuYWdlcj4gZ2V0UmVzb3VyY2VNYW5hZ2VyQ2xhc3MoKSB7DQotCQlyZXR1cm4gU0xVUk1SZXNvdXJjZU1hbmFnZXIuY2xhc3M7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3dpemFyZHMvU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcm1zL29yZy5lY2xpcHNlLnB0cC5ybS5zbHVybS51aS9zcmMvb3JnL2VjbGlwc2UvcHRwL3JtL3NsdXJtL3VpL3dpemFyZHMvU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJmZjhmLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IA0KLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQ0KLSAqDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAJCQlQZWljaGFuZyBTaGkgPHBjbXV0YXRlc0AxNjMuY29tPi88cGNzaGlAbnVkdC5lZHUuY24+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkud2l6YXJkczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5JUmVtb3RlQ29ubmVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLklSZW1vdGVTZXJ2aWNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS5jb3JlLlBUUFJlbW90ZUNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5yZW1vdGUuY29yZS5leGNlcHRpb24uUmVtb3RlQ29ubmVjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlGaWxlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5JUmVtb3RlVUlTZXJ2aWNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJlbW90ZS51aS5QVFBSZW1vdGVVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkuQWN0aXZhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkubWVzc2FnZXMuTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLklSTUNvbmZpZ3VyYXRpb25XaXphcmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC51dGlscy51aS5zd3QuU1dUVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2Ugew0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIFdpZGdldExpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciANCi0Jew0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIHsNCi0JCQlPYmplY3Qgc291cmNlID0gZXZ0LmdldFNvdXJjZSgpOw0KLQkJCWlmKCFsb2FkaW5nICYmIChzb3VyY2UgPT0gcGF0aFRleHQgfHwgc291cmNlID09IGFyZ3NUZXh0KSkgew0KLQkJCQl1cGRhdGVQYWdlKCk7DQotCQkJfQ0KLQkJfQ0KLQkNCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsNCi0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKSB7DQotCQkJCXVwZGF0ZVBhZ2UoKTsNCi0JCQl9DQotCQl9DQotCQ0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOw0KLQkJCWlmIChzb3VyY2UgPT0gYnJvd3NlQnV0dG9uKSB7DQotCQkJCWhhbmRsZVBhdGhCcm93c2VCdXR0b25TZWxlY3RlZCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCXVwZGF0ZVNldHRpbmdzKCk7DQotCQkJCXVwZGF0ZVBhZ2UoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb24gY29uZmlnOw0KLQlwcml2YXRlIFN0cmluZyBzbHVybWRQYXRoID0gRU1QVFlfU1RSSU5HOw0KLQlwcml2YXRlIFN0cmluZyBzbHVybWRBcmdzID0gRU1QVFlfU1RSSU5HOw0KLQlwcml2YXRlIElSZW1vdGVTZXJ2aWNlcyByZW1vdGVTZXJ2aWNlcyA9IG51bGw7DQotCXByaXZhdGUgSVJlbW90ZUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7DQotCXByaXZhdGUgYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQ7DQotCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0czsNCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0ID0gbnVsbDsNCi0NCi0JcHJpdmF0ZSBUZXh0IGFyZ3NUZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsNCi0JcHJpdmF0ZSBCdXR0b24gZGVmYXVsdEJ1dHRvbiA9IG51bGw7DQotCXByaXZhdGUgV2lkZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgV2lkZ2V0TGlzdGVuZXIoKTsNCi0JDQotCXB1YmxpYyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKElSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7DQotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZSk7DQotCQlzZXRUaXRsZShNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlKTsNCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb24pOw0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOw0KLQkJaXNWYWxpZCA9IHRydWU7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnB0cC51aS53aXphcmRzLlJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJR3JpZExheW91dCB0b3BMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkgICAgY29tcG9zaXRlLnNldExheW91dCh0b3BMYXlvdXQpOw0KLQkJY3JlYXRlQ29udGVudHMoY29tcG9zaXRlKTsNCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBpbiB0aGUgUk0gY29uZmlndXJhdGlvbi4gVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXINCi0JICogYW55dGhpbmcgaXMgY2hhbmdlZC4NCi0JICogDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIA0KLQl7DQotCQlzdG9yZSgpOw0KLQkJY29uZmlnLnNldFVzZURlZmF1bHRzKHVzZURlZmF1bHRzKTsNCi0JCWlmICghdXNlRGVmYXVsdHMpIHsNCi0JCQljb25maWcuc2V0U2x1cm1kUGF0aChzbHVybWRQYXRoKTsNCi0JCQljb25maWcuc2V0U2x1cm1kQXJncyhzbHVybWRBcmdzKTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KLQkJaWYgKHZpc2libGUpIHsNCi0JCQlpbml0Q29udGVudHMoKTsNCi0JCX0NCi0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aXphcmQgcGFnZS4NCi0JICogDQotCSAqIEBwYXJhbSBwYXJlbnQNCi0JICogQHBhcmFtIGNvbFNwYW4NCi0JICovDQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotCQkvKg0KLQkJICogQ29tcG9zaXRlIGZvciByZW1vdGUgcHJvdmlkZXIgYW5kIHByb3h5IGxvY2F0aW9uIGNvbWJvJ3MNCi0JCSAqLw0KLQkJQ29tcG9zaXRlIGNvbnRlbnRzID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWxheW91dC5udW1Db2x1bW5zID0gMzsNCi0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7DQotCQljb250ZW50cy5zZXRMYXlvdXQobGF5b3V0KTsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7DQotCQljb250ZW50cy5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCS8qDQotCQkgKiBEZWZhdWx0DQotCQkgKi8NCi0JCWRlZmF1bHRCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihjb250ZW50cywgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZWZhdWx0QnV0dG9uKTsNCi0JCWRlZmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMzsNCi0JCWRlZmF1bHRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7DQotDQotCQkvKg0KLQkJICogU0xVUk1EIHBhdGgNCi0JCSAqLw0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5OT05FKTsNCi0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9wYXRoKTsNCi0NCi0JCXBhdGhUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7DQotCQlnZC53aWR0aEhpbnQgPSA2MDsNCi0JCXBhdGhUZXh0LnNldExheW91dERhdGEoZ2QpOw0KLQkJcGF0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOw0KLQkJDQotCQlicm93c2VCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZVB1c2hCdXR0b24oY29udGVudHMsIE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uLCBudWxsKTsNCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7DQotCQkNCi0JCS8qDQotCQkgKiBTTFVSTUQgYXJncw0KLQkJICovDQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250ZW50cywgU1dULk5PTkUpOw0KLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2FyZ3VtZW50cyk7DQotCQkNCi0JCWFyZ3NUZXh0ID0gbmV3IFRleHQoY29udGVudHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7DQotCQlhcmdzVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCWFyZ3NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRyb2xzLg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50cygpIHsNCi0JCWxvYWRpbmcgPSB0cnVlOw0KLQkJY29uZmlnID0gKFNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbilnZXRDb25maWd1cmF0aW9uV2l6YXJkKCkuZ2V0Q29uZmlndXJhdGlvbigpOw0KLQkJbG9hZFNhdmVkKCk7DQotCQl1cGRhdGVTZXR0aW5ncygpOw0KLQkJZGVmYXVsdFNldHRpbmcoKTsNCi0JCWxvYWRpbmcgPSBmYWxzZTsNCi0JCXVwZGF0ZVBhZ2UoKTsJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBMb2FkIHRoZSBpbml0aWFsIHdpemFyZCBzdGF0ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzLg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGxvYWRTYXZlZCgpDQotCXsNCi0JCXVzZURlZmF1bHRzID0gY29uZmlnLnVzZURlZmF1bHRzKCk7DQotCQlzbHVybWRQYXRoID0gY29uZmlnLmdldFNsdXJtZFBhdGgoKTsNCi0JCXNsdXJtZEFyZ3MgPSBjb25maWcuZ2V0U2x1cm1kQXJncygpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHBhcmFtIGINCi0JICovDQotCXByaXZhdGUgdm9pZCBzZXRWYWxpZChib29sZWFuIGIpIHsNCi0JCWlzVmFsaWQgPSBiOw0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzVmFsaWQpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgc3RvcmUoKSANCi0Jew0KLQkJaWYgKCFsb2FkaW5nKSB7DQotCQkJaWYgKGRlZmF1bHRCdXR0b24gIT0gbnVsbCkgew0KLQkJCQl1c2VEZWZhdWx0cyA9IGRlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7DQotCQkJfQ0KLQkJCWlmIChwYXRoVGV4dCAhPSBudWxsKSB7DQotCQkJCXNsdXJtZFBhdGggPSBwYXRoVGV4dC5nZXRUZXh0KCk7DQotCQkJfQ0KLQkJCWlmIChhcmdzVGV4dCAhPSBudWxsKSB7DQotCQkJCXNsdXJtZEFyZ3MgPSBhcmdzVGV4dC5nZXRUZXh0KCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogVXBkYXRlIHdpemFyZCBVSSBzZWxlY3Rpb25zIGZyb20gc2V0dGluZ3MuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkNCi0JICogc2V0dGluZ3MgYXJlIGNoYW5nZWQuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2V0dGluZ3MoKSB7DQotCQlzdG9yZSgpOw0KLQkJcGF0aFRleHQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdHMpOw0KLQkJYXJnc1RleHQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdHMpOw0KLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoIXVzZURlZmF1bHRzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGJ1dHRvbiB3aWRnZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBsYWJlbA0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIHRoZSBidXR0b24gd2lkZ2V0DQotCSAqLw0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCB0eXBlKSB7DQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHR5cGUpOw0KLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOw0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7DQotCQlyZXR1cm4gYnV0dG9uOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGNoZWNrIGJ1dHRvbiB3aWRnZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBsYWJlbA0KLQkgKiBAcmV0dXJuIHRoZSBjaGVjayBidXR0b24gd2lkZ2V0DQotCSAqLw0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNoZWNrQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgew0KLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGxhYmVsLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBncmlkIGxheW91dC4NCi0JICogDQotCSAqIEBwYXJhbSBjb2x1bW5zDQotCSAqIEBwYXJhbSBpc0VxdWFsDQotCSAqIEBwYXJhbSBtaA0KLQkgKiBAcGFyYW0gbXcNCi0JICogQHJldHVybiB0aGUgbmV3IGdyaWQgbGF5b3V0DQotCSAqLw0KLQlwcm90ZWN0ZWQgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KGludCBjb2x1bW5zLCBib29sZWFuIGlzRXF1YWwsIGludCBtaCwgaW50IG13KSAgew0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IGNvbHVtbnM7DQotCQlncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGlzRXF1YWw7DQotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IG1oOw0KLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IG13Ow0KLQkJcmV0dXJuIGdyaWRMYXlvdXQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIG5ldyByYWRpbyBidXR0b24gaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQNCi0JICogbGF5b3V0IGRhdGEuDQotCSAqDQotCSAqIEBwYXJhbSBncm91cCAgdGhlIGNvbXBvc2l0ZSBpbiB3aGljaCB0byBjcmVhdGUgdGhlIHJhZGlvIGJ1dHRvbg0KLQkgKiBAcGFyYW0gbGFiZWwgIHRoZSBzdHJpbmcgdG8gc2V0IGludG8gdGhlIHJhZGlvIGJ1dHRvbg0KLQkgKiBAcGFyYW0gdmFsdWUgIHRoZSBzdHJpbmcgdG8gaWRlbnRpZnkgcmFkaW8gYnV0dG9uDQotCSAqIEByZXR1cm4gdGhlIG5ldyByYWRpbyBidXR0b24NCi0JICovIA0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHZhbHVlLCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJQnV0dG9uIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIGxhYmVsLCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7DQotCQlidXR0b24uc2V0RGF0YSgobnVsbCA9PSB2YWx1ZSkgPyBsYWJlbCA6IHZhbHVlKTsNCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOw0KLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7DQotCQlpZihudWxsICE9IGxpc3RlbmVyKSB7DQotCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsNCi0JCX0NCi0JCXJldHVybiBidXR0b247DQotCX0NCi0JDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGRlZmF1bHRTZXR0aW5nKCkgDQotCXsNCi0JCWRlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHVzZURlZmF1bHRzKTsNCi0JCXBhdGhUZXh0LnNldFRleHQoc2x1cm1kUGF0aCk7DQotCQlhcmdzVGV4dC5zZXRUZXh0KHNsdXJtZEFyZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDbGVhbiB1cCB0aGUgY29udGVudCBvZiBhIHRleHQgZmllbGQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGV4dA0KLQkgKiBAcmV0dXJuIGNsZWFuZWQgdXAgdGV4dC4NCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRDb250ZW50KFN0cmluZyB0ZXh0KSANCi0Jew0KLQkJaWYgKHRleHQudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgdGV4dC5lcXVhbHMoRU1QVFlfU1RSSU5HKSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JDQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2hvdyBhIGRpYWxvZyB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IGEgZmlsZS4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhdGhCcm93c2VCdXR0b25TZWxlY3RlZCgpIA0KLQl7DQotCQkvKg0KLQkJICogTmVlZCB0byBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGUgY29ubmVjdGlvbiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgDQotCQkgKiBieSB0aGUgcHJldmlvdXMgd2l6YXJkIHBhZ2UNCi0JCSAqLw0KLQkJU3RyaW5nIHJtSUQgPSBjb25maWcuZ2V0UmVtb3RlU2VydmljZXNJZCgpOw0KLQkJaWYgKHJtSUQgIT0gbnVsbCkgew0KLQkJCXJlbW90ZVNlcnZpY2VzID0gUFRQUmVtb3RlQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlU2VydmljZXMocm1JRCk7DQotCQkJU3RyaW5nIGNvbm4gPSBjb25maWcuZ2V0Q29ubmVjdGlvbk5hbWUoKTsNCi0JCQlpZiAocmVtb3RlU2VydmljZXMgIT0gbnVsbCAmJiBjb25uICE9IG51bGwpIHsNCi0JCQkJY29ubmVjdGlvbiA9IHJlbW90ZVNlcnZpY2VzLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0Q29ubmVjdGlvbihjb25uKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsNCi0JCQlpZiAoIWNvbm5lY3Rpb24uaXNPcGVuKCkpIHsNCi0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLA0KLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJY29ubmVjdGlvbi5vcGVuKG1vbml0b3IpOw0KLQkJCQkJCX0gY2F0Y2ggKFJlbW90ZUNvbm5lY3Rpb25FeGNlcHRpb24gZSkgew0KLQkJCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yLA0KLQkJCQkJCQkJCU1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2csDQotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQl9Ow0KLQkJCQl0cnkgew0KLQkJCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOw0KLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Nvbm5lY3Rpb25fZXJyb3IsDQotCQkJCQkJCU1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvcl9tc2csDQotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCkpKTsNCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLlNMVVJNQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfY29ubmVjdGlvbl9lcnJvciwNCi0JCQkJCQkJTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9jb25uZWN0aW9uX2Vycm9yX21zZywNCi0JCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCUlSZW1vdGVVSVNlcnZpY2VzIHJlbW90ZVVJU2VydmljZXMgPSBQVFBSZW1vdGVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3RlVUlTZXJ2aWNlcyhyZW1vdGVTZXJ2aWNlcyk7DQotCQkJSVJlbW90ZVVJRmlsZU1hbmFnZXIgZmlsZU1nciA9IHJlbW90ZVVJU2VydmljZXMuZ2V0VUlGaWxlTWFuYWdlcigpOw0KLQkJCQ0KLQkJCVN0cmluZyBpbml0aWFsUGF0aCA9ICIvLyI7IC8vIFN0YXJ0IGF0IHJvb3Qgc2luY2UgU0xVUk1EIGlzIHByb2JhYmx5IGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIHNvbWV3aGVyZSAvLyROT04tTkxTLTEkDQotCQkJSVBhdGggc2VsZWN0ZWRQYXRoID0gZmlsZU1nci5icm93c2VGaWxlKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5TTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3NlbGVjdCwgaW5pdGlhbFBhdGgpOw0KLQkJCWlmIChzZWxlY3RlZFBhdGggIT0gbnVsbCkgew0KLQkJCQlwYXRoVGV4dC5zZXRUZXh0KHNlbGVjdGVkUGF0aC50b1N0cmluZygpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4NCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRTZXR0aW5nKCkgDQotCXsNCi0JCWlmIChkZWZhdWx0QnV0dG9uICE9IG51bGwgJiYgZGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAocGF0aFRleHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyBuYW1lID0gZ2V0RmllbGRDb250ZW50KHBhdGhUZXh0LmdldFRleHQoKSk7DQotCQkJaWYgKG5hbWUgPT0gbnVsbCkgew0KLQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuU0xVUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZV9pbnZhbGlkKTsgDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBzdHlsZQ0KLQkgKiBAcGFyYW0gc3BhY2UNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJvdGVjdGVkIEdyaWREYXRhIHNwYW5HcmlkRGF0YShpbnQgc3R5bGUsIGludCBzcGFjZSkgDQotCXsNCi0JCUdyaWREYXRhIGdkID0gbnVsbDsNCi0JCWlmIChzdHlsZSA9PSAtMSkNCi0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZWxzZQ0KLQkJCWdkID0gbmV3IEdyaWREYXRhKHN0eWxlKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhY2U7DQotCQlyZXR1cm4gZ2Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZSgpIA0KLQl7DQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7DQotCQlzZXRNZXNzYWdlKG51bGwpOw0KLQkNCi0JCWlmICghaXNWYWxpZFNldHRpbmcoKSkgew0KLQkJCXNldFZhbGlkKGZhbHNlKTsNCi0JCX0gZWxzZSB7CQ0KLQkJCXBlcmZvcm1PaygpOw0KLQkJCXNldFZhbGlkKHRydWUpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5YjM3NS4uMDAwMDAwMAotLS0gYS9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvd2l6YXJkcy9TTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IA0KLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQ0KLSAqDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAJCQlQZWljaGFuZyBTaGkgPHBjbXV0YXRlc0AxNjMuY29tPi88cGNzaGlAbnVkdC5lZHUuY24+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkud2l6YXJkczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnJlbW90ZS51aS53aXphcmRzLkFic3RyYWN0UmVtb3RlUHJveHlSZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpLm1lc3NhZ2VzLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5JUk1Db25maWd1cmF0aW9uV2l6YXJkOw0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMNCi0JQWJzdHJhY3RSZW1vdGVQcm94eVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHsNCi0JDQotCXB1YmxpYyBTTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKElSTUNvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkKSB7DQotCQlzdXBlcih3aXphcmQsIE1lc3NhZ2VzLlNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfbmFtZSk7DQotCQlzZXRUaXRsZShNZXNzYWdlcy5TTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlKTsNCi0JCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlNMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzY3JpcHRpb24pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEgYi9ybXMvb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLnVpL3NyYy9vcmcvZWNsaXBzZS9wdHAvcm0vc2x1cm0vdWkvd2l6YXJkcy9TTFVSTVJlc291cmNlTWFuYWdlckNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGNhOGYwLi4wMDAwMDAwCi0tLSBhL3Jtcy9vcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkvc3JjL29yZy9lY2xpcHNlL3B0cC9ybS9zbHVybS91aS93aXphcmRzL1NMVVJNUmVzb3VyY2VNYW5hZ2VyQ29uZmlndXJhdGlvbldpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwyMDA5IA0KLSAqIFNjaG9vbCBvZiBDb21wdXRlciwgTmF0aW9uYWwgVW5pdmVyc2l0eSBvZiBEZWZlbnNlIFRlY2hub2xvZ3ksIFAuUi5DaGluYQ0KLSAqDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAJCQlQZWljaGFuZyBTaGkgPHBjbXV0YXRlc0AxNjMuY29tPi88cGNzaGlAbnVkdC5lZHUuY24+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucm0uc2x1cm0udWkud2l6YXJkczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnJtLnNsdXJtLmNvcmUucm1zeXN0ZW0uU0xVUk1SZXNvdXJjZU1hbmFnZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5JUk1Db25maWd1cmF0aW9uV2l6YXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAudWkud2l6YXJkcy5STUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkgZXh0ZW5kcw0KLQkJUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3Rvcnkgew0KLQ0KLQlwdWJsaWMgU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZUZhY3RvcnkoKSB7DQotCQkvLyBuby1vcA0KLQl9DQotDQotCXB1YmxpYyBSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlW10gZ2V0UGFnZXMoSVJNQ29uZmlndXJhdGlvbldpemFyZCB3aXphcmQpIHsNCi0JCXJldHVybiBuZXcgUk1Db25maWd1cmF0aW9uV2l6YXJkUGFnZVtdew0KLQkJCQluZXcgU0xVUk1SZXNvdXJjZU1hbmFnZXJDb25maWd1cmF0aW9uV2l6YXJkUGFnZSh3aXphcmQpLA0KLQkJCQkvL25ldyBTTFVSTUNvbmZpZ3VyYXRpb25XaXphcmRQYWdlKHdpemFyZCkNCi0JCX07DQotCX0NCi0NCi0JcHVibGljIENsYXNzPFNMVVJNUmVzb3VyY2VNYW5hZ2VyRmFjdG9yeT4gZ2V0Uk1GYWN0b3J5Q2xhc3MoKSB7DQotCQlyZXR1cm4gU0xVUk1SZXNvdXJjZU1hbmFnZXJGYWN0b3J5LmNsYXNzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLmNsYXNzcGF0aCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8ucHJvamVjdCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDg4ZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGE4YmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUaHUgSnVuIDE5IDA5OjE3OjA4IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2ZTVjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjIiLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSI1LjAuMCIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb247YnVuZGxlLXZlcnNpb249IjIuMS4wIiwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZTtidW5kbGUtdmVyc2lvbj0iMi4wLjAiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvcmVzb3VyY2VzL2luY2x1ZGVzL21waS5oIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9yZXNvdXJjZXMvaW5jbHVkZXMvbXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzFjZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9yZXNvdXJjZXMvaW5jbHVkZXMvbXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg3ICswLDAgQEAKLS8qIG9tcGkvaW5jbHVkZS9tcGkuaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFRoZSBUcnVzdGVlcyBvZiBJbmRpYW5hIFVuaXZlcnNpdHkgYW5kIEluZGlhbmEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRoZSBVbml2ZXJzaXR5IG9mIFRlbm5lc3NlZSBhbmQgVGhlIFVuaXZlcnNpdHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFRlbm5lc3NlZSBSZXNlYXJjaCBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBDZW50ZXIgU3R1dHRnYXJ0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBvZiBTdHV0dGdhcnQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgICAgICBDaXNjbyBTeXN0ZW1zLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogJENPUFlSSUdIVCQKLSAqCi0gKiBBZGRpdGlvbmFsIGNvcHlyaWdodHMgbWF5IGZvbGxvdwotICoKLSAqICRIRUFERVIkCi0gKi8KLQotI2lmbmRlZiBPTVBJX01QSV9ICi0jZGVmaW5lIE9NUElfTVBJX0gKLQotLyogVGhlIGNvbW1lbnQgYmVsb3cgKGFuZCB0aGUgZW5kaW5nIHBhcnRuZXIpIGFyZSBmb3IgYnVpbGRpbmcgZmF0Ci0gICBkaXN0cmlidXRpb25zIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuICBQbGVhc2UgZG8gbm90IHJlbW92ZSAqLwotCi0vKiBAT01QSV9CRUdJTl9DT05GSUdVUkVfU0VDVElPTkAgKi8KLQotI2lmbmRlZiBPTVBJX0NPTkZJR19ICi0KLS8qIE9ubHkgaW5jbHVkZSB0aGVzZSBpZiBPTVBJX0NPTkZJR19IIGlzbid0IGRlZmluZWQgKG1lYW5pbmcgaWYKLSAgIG9tcGlfY29uZmlnLmggaGFzbid0IGFscmVhZHkgYmVlbiBpbmNsdWRlZCkuICBPdGhlcndpc2UsIHdlJ2xsCi0gICBkdXBsaWNhdGUgYWxsIHRob3NlIHN5bWJvbHMuICBPTVBJIGNvZGluZyBzdGFuZGFyZHMgc2F5IHRoYXQKLSAgIG9tcGlfY29uZmlnLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgYWxsIG90aGVyIGZpbGVzLCBzbyB0aGlzCi0gICBzaG91bGQgYmUgZ29vZCBlbm91Z2ggKi8KLQotLyogV2hldGhlciB3ZSBoYXZlIEZPUlRSQU4gSU5URUdFUioxIG9yIG5vdCAqLwotI2RlZmluZSBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMSAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIElOVEVHRVIqMTYgb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVIxNiAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIElOVEVHRVIqMiBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjIgMAotCi0vKiBXaGV0aGVyIHdlIGhhdmUgRk9SVFJBTiBJTlRFR0VSKjQgb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVI0IDAKLQotLyogV2hldGhlciB3ZSBoYXZlIEZPUlRSQU4gSU5URUdFUio4IG9yIG5vdCAqLwotI2RlZmluZSBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSOCAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIFJFQUwqMTYgb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX1JFQUwxNiAwCi0KLS8qIFdoZXRoZXIgd2UgaGF2ZSBGT1JUUkFOIFJFQUwqNCBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDQgMAotCi0vKiBXaGV0aGVyIHdlIGhhdmUgRk9SVFJBTiBSRUFMKjggb3Igbm90ICovCi0jZGVmaW5lIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw4IDAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgbG9uZycuICovCi0jZGVmaW5lIEhBVkVfTE9OR19MT05HIDEKLQotLyogVGhlIHNpemUgb2YgYSBgYm9vbCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSNkZWZpbmUgU0laRU9GX0JPT0wgMQotCi0vKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0jZGVmaW5lIFNJWkVPRl9JTlQgNAotCi0vKiBUeXBlIG9mIE1QSV9PZmZzZXQgLS0gaGFzIHRvIGJlIGRlZmluZWQgaGVyZSBhbmQgdHlwZWRlZidlZCBsYXRlciBiZWNhdXNlIG1waS5oIGRvZXMgbm90IGdldCBBQyBTVUJTVCdzICovCi0jZGVmaW5lIE9NUElfTVBJX09GRlNFVF9UWVBFIGxvbmcgbG9uZwotCi0vKiB0eXBlIHRvIHVzZSBmb3IgcHRyZGlmZl90LCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgc2V0IHRvIHB0cmRpZmZfdCBpZiBpdCBkb2VzIGV4aXN0ICovCi0jZGVmaW5lIE9NUElfUFRSRElGRl9UWVBFIHB0cmRpZmZfdAotCi0vKiBXaGV0aGVyIHdlIHdhbnQgTVBJIGN4eCBzdXBwb3J0IG9yIG5vdCAqLwotI2RlZmluZSBPTVBJX1dBTlRfQ1hYX0JJTkRJTkdTIDEKLQotLyogZG8gd2Ugd2FudCB0byB0cnkgdG8gd29yayBhcm91bmQgQysrIGJpbmRpbmdzIFNFRUtfKiBpc3N1ZT8gKi8KLSNkZWZpbmUgT01QSV9XQU5UX01QSV9DWFhfU0VFSyAxCi0KLS8qIFdoZXRoZXIgYSBjb25zdF9jYXN0IG9uIGEgMi1kIGFycmF5IHdpbGwgd29yayB3aXRoIHRoZSBDKysgY29tcGlsZXIgKi8KLSNkZWZpbmUgT01QSV9DWFhfU1VQUE9SVFNfMkRfQ09OU1RfQ0FTVCAxCi0KLS8qIFdoZXRoZXIgd2Ugd2FudCB0aGUgTVBJIGY3NyBiaW5kaW5ncyBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9XQU5UX0Y3N19CSU5ESU5HUyAwCi0KLS8qIFdoZXRoZXIgd2Ugd2FudCB0aGUgTVBJIGY5MCBiaW5kaW5ncyBvciBub3QgKi8KLSNkZWZpbmUgT01QSV9XQU5UX0Y5MF9CSU5ESU5HUyAwCi0KLS8qIFdoZXRoZXIgb3Igbm90IHdlIGhhdmUgY29tcGlsZWQgd2l0aCBDKysgZXhjZXB0aW9ucyBzdXBwb3J0ICovCi0jZGVmaW5lIE9NUElfSEFWRV9DWFhfRVhDRVBUSU9OX1NVUFBPUlQgMAotCi0vKiBNUEkgZGF0YXR5cGUgY29ycmVzcG9uZGluZyB0byBNUElfT2Zmc2V0ICovCi0jZGVmaW5lIE9NUElfT0ZGU0VUX0RBVEFUWVBFIE1QSV9MT05HX0xPTkcKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi0KLS8qIE1ham9yLCBtaW5vciwgYW5kIHJlbGVhc2UgdmVyc2lvbiBvZiBPcGVuIE1QSSAqLwotI2RlZmluZSBPTVBJX01BSk9SX1ZFUlNJT04gMQotI2RlZmluZSBPTVBJX01JTk9SX1ZFUlNJT04gMgotI2RlZmluZSBPTVBJX1JFTEVBU0VfVkVSU0lPTiAzCi0KLS8qIEEgIHR5cGUgdGhhdCBhbGxvd3MgdXMgdG8gaGF2ZSBzZW50aW5lbCB0eXBlIHZhbHVlcyB0aGF0IGFyZSBzdGlsbAotICAgdmFsaWQgKi8KLSNkZWZpbmUgb21waV9mb3J0cmFuX2JvZ3VzX3R5cGVfdCBpbnQKLQotLyogQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gRk9SVFJBTiBJTlRFR0VSICovCi0jZGVmaW5lIG9tcGlfZm9ydHJhbl9pbnRlZ2VyX3Qgb21waV9mb3J0cmFuX2JvZ3VzX3R5cGVfdAotCi0jaWZuZGVmIE9NUElfREVDTFNQRUMKLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKLSNkZWZpbmUgT01QSV9ERUNMU1BFQyBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbHNlCi0jZGVmaW5lIE9NUElfREVDTFNQRUMKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTVBJX0ZpbnQKLS8qIE1QSV9GaW50IGlzIHRoZSBzYW1lIGFzIG9tcGlfZm9ydHJhbl9JTlRFR0VSX3QgKi8KLSNkZWZpbmUgTVBJX0ZpbnQgb21waV9mb3J0cmFuX2ludGVnZXJfdAotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZuZGVmIE9NUElfQ09ORklHX0ggKi8KLQotLyogQE9NUElfRU5EX0NPTkZJR1VSRV9TRUNUSU9OQCAqLwotCi0vKiBpbmNsdWRlIGZvciBwdHJkaWZmX3QgKi8KLSNpZmRlZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0jaWZuZGVmIE9NUElfQlVJTERJTkcKLSNkZWZpbmUgT01QSV9CVUlMRElORyAwCi0jZW5kaWYKLQotCi0vKgotICogSnVzdCBpbiBjYXNlIHlvdSBuZWVkIGl0LiAgOi0pCi0gKi8KLSNkZWZpbmUgT1BFTl9NUEkgMQotCi0vKgotICogTVBJIHZlcnNpb24KLSAqLwotI2RlZmluZSBNUElfVkVSU0lPTiAyCi0jZGVmaW5lIE1QSV9TVUJWRVJTSU9OIDAKLQotLyoKLSAqIFRvIGFjY29tb2RhdGUgcHJvZ3JhbXMgd3JpdHRlbiBmb3IgTVBJIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBhCi0gKiBzdHJhaWdodCBST01JTyBpbXBvcnQKLSAqLwotI2lmICFPTVBJX0JVSUxESU5HCi0jZGVmaW5lIE1QSU9fUmVxdWVzdCBNUElfUmVxdWVzdAotI2RlZmluZSBNUElPX1Rlc3QgTVBJX1Rlc3QKLSNkZWZpbmUgTVBJT19XYWl0IE1QSV9XYWl0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoY19wbHVzcGx1cykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogVHlwZWRlZnMKLSAqLwotCi10eXBlZGVmIE9NUElfUFRSRElGRl9UWVBFIE1QSV9BaW50OwotdHlwZWRlZiBPTVBJX01QSV9PRkZTRVRfVFlQRSBNUElfT2Zmc2V0OwotdHlwZWRlZiBzdHJ1Y3Qgb21waV9jb21tdW5pY2F0b3JfdCAqTVBJX0NvbW07Ci10eXBlZGVmIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3QgKk1QSV9EYXRhdHlwZTsKLXR5cGVkZWYgc3RydWN0IG9tcGlfZXJyaGFuZGxlcl90ICpNUElfRXJyaGFuZGxlcjsKLXR5cGVkZWYgc3RydWN0IG9tcGlfZmlsZV90ICpNUElfRmlsZTsKLXR5cGVkZWYgc3RydWN0IG9tcGlfZ3JvdXBfdCAqTVBJX0dyb3VwOwotdHlwZWRlZiBzdHJ1Y3Qgb21waV9pbmZvX3QgKk1QSV9JbmZvOwotdHlwZWRlZiBzdHJ1Y3Qgb21waV9vcF90ICpNUElfT3A7Ci10eXBlZGVmIHN0cnVjdCBvbXBpX3JlcXVlc3RfdCAqTVBJX1JlcXVlc3Q7Ci10eXBlZGVmIHN0cnVjdCBvbXBpX3N0YXR1c19wdWJsaWNfdCBNUElfU3RhdHVzOwotdHlwZWRlZiBzdHJ1Y3Qgb21waV93aW5fdCAqTVBJX1dpbjsKLQotLyoKLSAqIE1QSV9TdGF0dXMKLSAqLwotc3RydWN0IG9tcGlfc3RhdHVzX3B1YmxpY190IHsKLSAgaW50IE1QSV9TT1VSQ0U7Ci0gIGludCBNUElfVEFHOwotICBpbnQgTVBJX0VSUk9SOwotICBpbnQgX2NvdW50OwotICBpbnQgX2NhbmNlbGxlZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBvbXBpX3N0YXR1c19wdWJsaWNfdCBvbXBpX3N0YXR1c19wdWJsaWNfdDsKLQotLyoKLSAqIFVzZXIgdHlwZWRlZnMKLSAqLwotdHlwZWRlZiBpbnQgKE1QSV9Db3B5X2Z1bmN0aW9uKShNUElfQ29tbSwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqLCBpbnQgKik7Ci10eXBlZGVmIGludCAoTVBJX0RlbGV0ZV9mdW5jdGlvbikoTVBJX0NvbW0sIGludCwgdm9pZCAqLCB2b2lkICopOwotdHlwZWRlZiBpbnQgKE1QSV9EYXRhcmVwX2V4dGVudF9mdW5jdGlvbikoTVBJX0RhdGF0eXBlLCBNUElfQWludCAqLCB2b2lkICopOwotdHlwZWRlZiBpbnQgKE1QSV9EYXRhcmVwX2NvbnZlcnNpb25fZnVuY3Rpb24pKHZvaWQgKiwgTVBJX0RhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgdm9pZCAqLCBNUElfT2Zmc2V0LCB2b2lkICopOwotdHlwZWRlZiB2b2lkIChNUElfQ29tbV9lcnJoYW5kbGVyX2ZuKShNUElfQ29tbSAqLCBpbnQgKiwgLi4uKTsKLXR5cGVkZWYgdm9pZCAoTVBJX0ZpbGVfZXJyaGFuZGxlcl9mbikoTVBJX0ZpbGUgKiwgaW50ICosIC4uLik7Ci10eXBlZGVmIHZvaWQgKE1QSV9XaW5fZXJyaGFuZGxlcl9mbikoTVBJX1dpbiAqLCBpbnQgKiwgLi4uKTsKLXR5cGVkZWYgdm9pZCAoTVBJX0hhbmRsZXJfZnVuY3Rpb24pKE1QSV9Db21tICosIGludCAqLCAuLi4pOwotdHlwZWRlZiB2b2lkIChNUElfVXNlcl9mdW5jdGlvbikodm9pZCAqLCB2b2lkICosIGludCAqLCBNUElfRGF0YXR5cGUgKik7Ci10eXBlZGVmIGludCAoTVBJX0NvbW1fY29weV9hdHRyX2Z1bmN0aW9uKShNUElfQ29tbSwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqLCBpbnQgKik7Ci10eXBlZGVmIGludCAoTVBJX0NvbW1fZGVsZXRlX2F0dHJfZnVuY3Rpb24pKE1QSV9Db21tLCBpbnQsIHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfVHlwZV9jb3B5X2F0dHJfZnVuY3Rpb24pKE1QSV9EYXRhdHlwZSwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqLCBpbnQgKik7Ci10eXBlZGVmIGludCAoTVBJX1R5cGVfZGVsZXRlX2F0dHJfZnVuY3Rpb24pKE1QSV9EYXRhdHlwZSwgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfV2luX2NvcHlfYXR0cl9mdW5jdGlvbikoTVBJX1dpbiwgaW50LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLCB2b2lkICosIGludCAqKTsKLXR5cGVkZWYgaW50IChNUElfV2luX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uKShNUElfV2luLCBpbnQsIHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfR3JlcXVlc3RfcXVlcnlfZnVuY3Rpb24pKHZvaWQgKiwgTVBJX1N0YXR1cyAqKTsKLXR5cGVkZWYgaW50IChNUElfR3JlcXVlc3RfZnJlZV9mdW5jdGlvbikodm9pZCAqKTsKLXR5cGVkZWYgaW50IChNUElfR3JlcXVlc3RfY2FuY2VsX2Z1bmN0aW9uKSh2b2lkICosIGludCk7Ci0KLS8qCi0gKiBNaXNjZWxsYW5lb3VzIGNvbnN0YW50cwotICovCi0jZGVmaW5lIE1QSV9BTllfU09VUkNFICAgICAgICAgLTEgICAgICAvKiBtYXRjaCBhbnkgc291cmNlIHJhbmsgKi8KLSNkZWZpbmUgTVBJX1BST0NfTlVMTCAgICAgICAgICAtMiAgICAgIC8qIHJhbmsgb2YgbnVsbCBwcm9jZXNzICovCi0jZGVmaW5lIE1QSV9ST09UICAgICAgICAgICAgICAgLTQKLSNkZWZpbmUgTVBJX0FOWV9UQUcgICAgICAgICAgICAtMSAgICAgIC8qIG1hdGNoIGFueSBtZXNzYWdlIHRhZyAqLwotI2RlZmluZSBNUElfTUFYX1BST0NFU1NPUl9OQU1FIDI1NiAgICAgLyogbWF4IHByb2MuIG5hbWUgbGVuZ3RoICovCi0jZGVmaW5lIE1QSV9NQVhfRVJST1JfU1RSSU5HICAgMjU2ICAgICAvKiBtYXggZXJyb3IgbWVzc2FnZSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX01BWF9PQkpFQ1RfTkFNRSAgICA2NCAgICAgIC8qIG1heCBvYmplY3QgbmFtZSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX1VOREVGSU5FRCAgICAgICAgICAtMzI3NjYgIC8qIHVuZGVmaW5lZCBzdHVmZiAqLwotI2RlZmluZSBNUElfQ0FSVCAgICAgICAgICAgICAgIDEgICAgICAgLyogY2FydGVzaWFuIHRvcG9sb2d5ICovCi0jZGVmaW5lIE1QSV9HUkFQSCAgICAgICAgICAgICAgMiAgICAgICAvKiBncmFwaCB0b3BvbG9neSAqLwotI2RlZmluZSBNUElfS0VZVkFMX0lOVkFMSUQgICAgIC0xICAgICAgLyogaW52YWxpZCBrZXkgdmFsdWUgKi8KLQotLyoKLSAqIE1vcmUgY29uc3RhbnRzCi0gKi8KLSNkZWZpbmUgTVBJX0JPVFRPTSAgICAgICAgICAgICAgICgodm9pZCAqKSAwKSAgICAvKiBiYXNlIHJlZmVyZW5jZSBhZGRyZXNzICovCi0jZGVmaW5lIE1QSV9JTl9QTEFDRSAgICAgICAgICAgICAoKHZvaWQgKikgMSkgICAgLyogaW4gcGxhY2UgYnVmZmVyICovCi0jZGVmaW5lIE1QSV9CU0VORF9PVkVSSEVBRCAgICAgICAxMjggICAgIC8qIHNpemUgb2YgYnNlbmQgaGVhZGVyICsgcHRyICovCi0jZGVmaW5lIE1QSV9NQVhfSU5GT19LRVkgICAgICAgICAzNiAgICAgIC8qIG1heCBpbmZvIGtleSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX01BWF9JTkZPX1ZBTCAgICAgICAgIDI1NiAgICAgLyogbWF4IGluZm8gdmFsdWUgbGVuZ3RoICovCi0jZGVmaW5lIE1QSV9BUkdWX05VTEwgICAgICAgICAgICAoKGNoYXIgKiopIDApICAgLyogTlVMTCBhcmd1bWVudCB2ZWN0b3IgKi8KLSNkZWZpbmUgTVBJX0FSR1ZTX05VTEwgICAgICAgICAgICgoY2hhciAqKiopIDApICAvKiBOVUxMIGFyZ3VtZW50IHZlY3RvcnMgKi8KLSNkZWZpbmUgTVBJX0VSUkNPREVTX0lHTk9SRSAgICAgICgoaW50ICopIDApICAgIC8qIGRvbid0IHJldHVybiBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBNUElfTUFYX1BPUlRfTkFNRSAgICAgICAgMzYgICAgICAvKiBtYXggcG9ydCBuYW1lIGxlbmd0aCAqLwotI2RlZmluZSBNUElfTUFYX05BTUVfTEVOICAgICAgICAgTVBJX01BWF9QT1JUX05BTUUgLyogbWF4IHBvcnQgbmFtZSBsZW5ndGggKi8KLSNkZWZpbmUgTVBJX09SREVSX0MgICAgICAgICAgICAgIDAgICAgICAgLyogQyByb3cgbWFqb3Igb3JkZXIgKi8KLSNkZWZpbmUgTVBJX09SREVSX0ZPUlRSQU4gICAgICAgIDEgICAgICAgLyogRm9ydHJhbiBjb2x1bW4gbWFqb3Igb3JkZXIgKi8KLSNkZWZpbmUgTVBJX0RJU1RSSUJVVEVfQkxPQ0sgICAgIDAgICAgICAgLyogYmxvY2sgZGlzdHJpYnV0aW9uICovCi0jZGVmaW5lIE1QSV9ESVNUUklCVVRFX0NZQ0xJQyAgICAxICAgICAgIC8qIGN5Y2xpYyBkaXN0cmlidXRpb24gKi8KLSNkZWZpbmUgTVBJX0RJU1RSSUJVVEVfTk9ORSAgICAgIDIgICAgICAgLyogbm90IGRpc3RyaWJ1dGVkICovCi0jZGVmaW5lIE1QSV9ESVNUUklCVVRFX0RGTFRfREFSRyAoLTEpICAgIC8qIGRlZmF1bHQgZGlzdHJpYnV0aW9uIGFyZyAqLwotCi0vKgotICogU2luY2UgdGhlc2UgdmFsdWVzIGFyZSBhcmJpdHJhcnkgdG8gT3BlbiBNUEksIHdlIG1pZ2h0IGFzIHdlbGwgbWFrZQotICogdGhlbSB0aGUgc2FtZSBhcyBST01JTyBmb3IgZWFzZSBvZiBtYXBwaW5nLiAgVGhlc2UgdmFsdWVzIHRha2VuCi0gKiBmcm9tIFJPTUlPJ3MgbXBpby5oIGZpbGUuCi0gKi8KLSNkZWZpbmUgTVBJX01PREVfQ1JFQVRFICAgICAgICAgICAgICAxICAvKiBBRElPX0NSRUFURSAqLwotI2RlZmluZSBNUElfTU9ERV9SRE9OTFkgICAgICAgICAgICAgIDIgIC8qIEFESU9fUkRPTkxZICovCi0jZGVmaW5lIE1QSV9NT0RFX1dST05MWSAgICAgICAgICAgICAgNCAgLyogQURJT19XUk9OTFkgICovCi0jZGVmaW5lIE1QSV9NT0RFX1JEV1IgICAgICAgICAgICAgICAgOCAgLyogQURJT19SRFdSICAqLwotI2RlZmluZSBNUElfTU9ERV9ERUxFVEVfT05fQ0xPU0UgICAgMTYgIC8qIEFESU9fREVMRVRFX09OX0NMT1NFICovCi0jZGVmaW5lIE1QSV9NT0RFX1VOSVFVRV9PUEVOICAgICAgICAzMiAgLyogQURJT19VTklRVUVfT1BFTiAqLwotI2RlZmluZSBNUElfTU9ERV9FWENMICAgICAgICAgICAgICAgNjQgIC8qIEFESU9fRVhDTCAqLwotI2RlZmluZSBNUElfTU9ERV9BUFBFTkQgICAgICAgICAgICAxMjggIC8qIEFESU9fQVBQRU5EICovCi0jZGVmaW5lIE1QSV9NT0RFX1NFUVVFTlRJQUwgICAgICAgIDI1NiAgLyogQURJT19TRVFVRU5USUFMICovCi0KLSNkZWZpbmUgTVBJX0RJU1BMQUNFTUVOVF9DVVJSRU5UICAgLTU0Mjc4Mjc4Ci0KLSNkZWZpbmUgTVBJX1NFRUtfU0VUICAgICAgICAgICAgNjAwCi0jZGVmaW5lIE1QSV9TRUVLX0NVUiAgICAgICAgICAgIDYwMgotI2RlZmluZSBNUElfU0VFS19FTkQgICAgICAgICAgICA2MDQKLQotI2RlZmluZSBNUElfTUFYX0RBVEFSRVBfU1RSSU5HICAxMjgKLQotLyoKLSAqIE1QSS0yIE9uZS1TaWRlZCBDb21tdW5pY2F0aW9ucyBhc3NlcnRzCi0gKi8KLSNkZWZpbmUgTVBJX01PREVfTk9DSEVDSyAgICAgICAgICAgICAxCi0jZGVmaW5lIE1QSV9NT0RFX05PUFJFQ0VERSAgICAgICAgICAgMgotI2RlZmluZSBNUElfTU9ERV9OT1BVVCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTVBJX01PREVfTk9TVE9SRSAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1QSV9NT0RFX05PU1VDQ0VFRCAgICAgICAgICAxNgotCi0jZGVmaW5lIE1QSV9MT0NLX0VYQ0xVU0lWRSAgICAgICAgICAgMQotI2RlZmluZSBNUElfTE9DS19TSEFSRUQgICAgICAgICAgICAgIDIKLQotCi0vKgotICogUHJlZGVmaW5lZCBhdHRyaWJ1dGUga2V5dmFscwotICoKLSAqIERPIE5PVCBDSEFOR0UgVEhFIE9SREVSIFdJVEhPVVQgQUxTTyBDSEFOR0lORyBUSEUgT1JERVIgSU4KLSAqIHNyYy9hdHRyaWJ1dGUvYXR0cmlidXRlX3ByZWRlZmluZWQuYyBhbmQgbXBpZi5oLmluLgotICovCi1lbnVtIHsKLSAgICAvKiBNUEktMSAqLwotICAgIE1QSV9UQUdfVUIsCi0gICAgTVBJX0hPU1QsCi0gICAgTVBJX0lPLAotICAgIE1QSV9XVElNRV9JU19HTE9CQUwsCi0KLSAgICAvKiBNUEktMiAqLwotICAgIE1QSV9BUFBOVU0sCi0gICAgTVBJX0xBU1RVU0VEQ09ERSwKLSAgICBNUElfVU5JVkVSU0VfU0laRSwKLSAgICBNUElfV0lOX0JBU0UsCi0gICAgTVBJX1dJTl9TSVpFLAotICAgIE1QSV9XSU5fRElTUF9VTklULAotCi0gICAgLyogRXZlbiB0aG91Z2ggdGhlc2UgZm91ciBhcmUgSU1QSSBhdHRyaWJ1dGVzLCB0aGV5IG5lZWQgdG8gYmUgdGhlcmUKLSAgICAgICBmb3IgYWxsIE1QSSBqb2JzICovCi0gICAgSU1QSV9DTElFTlRfU0laRSwKLSAgICBJTVBJX0NMSUVOVF9DT0xPUiwKLSAgICBJTVBJX0hPU1RfU0laRSwKLSAgICBJTVBJX0hPU1RfQ09MT1IKLX07Ci0KLS8qCi0gKiBFcnJvciBjbGFzc2VzIGFuZCBjb2RlcwotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZXNlIHdpdGhvdXQgYWxzbyBtb2RpZnlpbmcgbXBpZi5oLmluLgotICovCi0jZGVmaW5lIE1QSV9TVUNDRVNTICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVBJX0VSUl9CVUZGRVIgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNUElfRVJSX0NPVU5UICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1QSV9FUlJfVFlQRSAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTVBJX0VSUl9UQUcgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBNUElfRVJSX0NPTU0gICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1QSV9FUlJfUkFOSyAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTVBJX0VSUl9SRVFVRVNUICAgICAgICAgICAgICAgNwotI2RlZmluZSBNUElfRVJSX1JPT1QgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIE1QSV9FUlJfR1JPVVAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgTVBJX0VSUl9PUCAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgTVBJX0VSUl9UT1BPTE9HWSAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTVBJX0VSUl9ESU1TICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTVBJX0VSUl9BUkcgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgTVBJX0VSUl9VTktOT1dOICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgTVBJX0VSUl9UUlVOQ0FURSAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgTVBJX0VSUl9PVEhFUiAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgTVBJX0VSUl9JTlRFUk4gICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgTVBJX0VSUl9JTl9TVEFUVVMgICAgICAgICAgICAgMTgKLSNkZWZpbmUgTVBJX0VSUl9QRU5ESU5HICAgICAgICAgICAgICAgMTkKLSNkZWZpbmUgTVBJX0VSUl9BQ0NFU1MgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgTVBJX0VSUl9BTU9ERSAgICAgICAgICAgICAgICAgMjEKLSNkZWZpbmUgTVBJX0VSUl9BU1NFUlQgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgTVBJX0VSUl9CQURfRklMRSAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgTVBJX0VSUl9CQVNFICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgTVBJX0VSUl9DT05WRVJTSU9OICAgICAgICAgICAgMjUKLSNkZWZpbmUgTVBJX0VSUl9ESVNQICAgICAgICAgICAgICAgICAgMjYKLSNkZWZpbmUgTVBJX0VSUl9EVVBfREFUQVJFUCAgICAgICAgICAgMjcKLSNkZWZpbmUgTVBJX0VSUl9GSUxFX0VYSVNUUyAgICAgICAgICAgMjgKLSNkZWZpbmUgTVBJX0VSUl9GSUxFX0lOX1VTRSAgICAgICAgICAgMjkKLSNkZWZpbmUgTVBJX0VSUl9GSUxFICAgICAgICAgICAgICAgICAgMzAKLSNkZWZpbmUgTVBJX0VSUl9JTkZPX0tFWSAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgTVBJX0VSUl9JTkZPX05PS0VZICAgICAgICAgICAgMzIKLSNkZWZpbmUgTVBJX0VSUl9JTkZPX1ZBTFVFICAgICAgICAgICAgMzMKLSNkZWZpbmUgTVBJX0VSUl9JTkZPICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgTVBJX0VSUl9JTyAgICAgICAgICAgICAgICAgICAgMzUKLSNkZWZpbmUgTVBJX0VSUl9LRVlWQUwgICAgICAgICAgICAgICAgMzYKLSNkZWZpbmUgTVBJX0VSUl9MT0NLVFlQRSAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgTVBJX0VSUl9OQU1FICAgICAgICAgICAgICAgICAgMzgKLSNkZWZpbmUgTVBJX0VSUl9OT19NRU0gICAgICAgICAgICAgICAgMzkKLSNkZWZpbmUgTVBJX0VSUl9OT1RfU0FNRSAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgTVBJX0VSUl9OT19TUEFDRSAgICAgICAgICAgICAgNDEKLSNkZWZpbmUgTVBJX0VSUl9OT19TVUNIX0ZJTEUgICAgICAgICAgNDIKLSNkZWZpbmUgTVBJX0VSUl9QT1JUICAgICAgICAgICAgICAgICAgNDMKLSNkZWZpbmUgTVBJX0VSUl9RVU9UQSAgICAgICAgICAgICAgICAgNDQKLSNkZWZpbmUgTVBJX0VSUl9SRUFEX09OTFkgICAgICAgICAgICAgNDUKLSNkZWZpbmUgTVBJX0VSUl9STUFfQ09ORkxJQ1QgICAgICAgICAgNDYKLSNkZWZpbmUgTVBJX0VSUl9STUFfU1lOQyAgICAgICAgICAgICAgNDcKLSNkZWZpbmUgTVBJX0VSUl9TRVJWSUNFICAgICAgICAgICAgICAgNDgKLSNkZWZpbmUgTVBJX0VSUl9TSVpFICAgICAgICAgICAgICAgICAgNDkKLSNkZWZpbmUgTVBJX0VSUl9TUEFXTiAgICAgICAgICAgICAgICAgNTAKLSNkZWZpbmUgTVBJX0VSUl9VTlNVUFBPUlRFRF9EQVRBUkVQICAgNTEKLSNkZWZpbmUgTVBJX0VSUl9VTlNVUFBPUlRFRF9PUEVSQVRJT04gNTIKLSNkZWZpbmUgTVBJX0VSUl9XSU4gICAgICAgICAgICAgICAgICAgNTMKLSNkZWZpbmUgTVBJX0VSUl9MQVNUQ09ERSAgICAgICAgICAgICAgNTQKLQotI2RlZmluZSBNUElfRVJSX1NZU1JFU09VUkNFICAgICAgICAgIC0yCi0KLQotLyoKLSAqIENvbXBhcmlzb24gcmVzdWx0cy4gIERvbid0IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UsIHRoZSBncm91cAotICogY29tcGFyaXNvbiBmdW5jdGlvbnMgcmVseSBvbiBpdC4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZXNlIHdpdGhvdXQgYWxzbyBtb2RpZnlpbmcgbXBpZi5oLmluLgotICovCi1lbnVtIHsKLSAgTVBJX0lERU5ULAotICBNUElfQ09OR1JVRU5ULAotICBNUElfU0lNSUxBUiwKLSAgTVBJX1VORVFVQUwKLX07Ci0KLS8qCi0gKiBNUElfSW5pdF90aHJlYWQgY29uc3RhbnRzCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSB3aXRob3V0IGFsc28gbW9kaWZ5aW5nIG1waWYuaC5pbi4KLSAqLwotZW51bSB7Ci0gIE1QSV9USFJFQURfU0lOR0xFLAotICBNUElfVEhSRUFEX0ZVTk5FTEVELAotICBNUElfVEhSRUFEX1NFUklBTElaRUQsCi0gIE1QSV9USFJFQURfTVVMVElQTEUKLX07Ci0KLS8qCi0gKiBEYXRhdHlwZSBjb21iaW5lcnMuCi0gKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSB3aXRob3V0IGFsc28gbW9kaWZ5aW5nIG1waWYuaC5pbi4KLSAqLwotZW51bSB7Ci0gIE1QSV9DT01CSU5FUl9OQU1FRCwKLSAgTVBJX0NPTUJJTkVSX0RVUCwKLSAgTVBJX0NPTUJJTkVSX0NPTlRJR1VPVVMsCi0gIE1QSV9DT01CSU5FUl9WRUNUT1IsCi0gIE1QSV9DT01CSU5FUl9IVkVDVE9SX0lOVEVHRVIsCi0gIE1QSV9DT01CSU5FUl9IVkVDVE9SLAotICBNUElfQ09NQklORVJfSU5ERVhFRCwKLSAgTVBJX0NPTUJJTkVSX0hJTkRFWEVEX0lOVEVHRVIsCi0gIE1QSV9DT01CSU5FUl9ISU5ERVhFRCwKLSAgTVBJX0NPTUJJTkVSX0lOREVYRURfQkxPQ0ssCi0gIE1QSV9DT01CSU5FUl9TVFJVQ1RfSU5URUdFUiwKLSAgTVBJX0NPTUJJTkVSX1NUUlVDVCwKLSAgTVBJX0NPTUJJTkVSX1NVQkFSUkFZLAotICBNUElfQ09NQklORVJfREFSUkFZLAotICBNUElfQ09NQklORVJfRjkwX1JFQUwsCi0gIE1QSV9DT01CSU5FUl9GOTBfQ09NUExFWCwKLSAgTVBJX0NPTUJJTkVSX0Y5MF9JTlRFR0VSLAotICBNUElfQ09NQklORVJfUkVTSVpFRAotfTsKLQotLyoKLSAqIE5VTEwgaGFuZGxlcwotICovCi0jZGVmaW5lIE1QSV9HUk9VUF9OVUxMICgmb21waV9tcGlfZ3JvdXBfbnVsbCkKLSNkZWZpbmUgTVBJX0NPTU1fTlVMTCAoJm9tcGlfbXBpX2NvbW1fbnVsbCkKLSNkZWZpbmUgTVBJX1JFUVVFU1RfTlVMTCAoJm9tcGlfcmVxdWVzdF9udWxsKQotI2RlZmluZSBNUElfT1BfTlVMTCAoJm9tcGlfbXBpX29wX251bGwpCi0jZGVmaW5lIE1QSV9FUlJIQU5ETEVSX05VTEwgKCZvbXBpX21waV9lcnJoYW5kbGVyX251bGwpCi0jZGVmaW5lIE1QSV9JTkZPX05VTEwgKCZvbXBpX21waV9pbmZvX251bGwpCi0jZGVmaW5lIE1QSV9XSU5fTlVMTCAoJm9tcGlfbXBpX3dpbl9udWxsKQotI2RlZmluZSBNUElfRklMRV9OVUxMICgmb21waV9tcGlfZmlsZV9udWxsKQotCi0jZGVmaW5lIE1QSV9TVEFUVVNfSUdOT1JFICgoTVBJX1N0YXR1cyAqKSAwKQotI2RlZmluZSBNUElfU1RBVFVTRVNfSUdOT1JFICgoTVBJX1N0YXR1cyAqKSAwKQotCi0vKiBNUEktMiBzcGVjaWZpZXMgdGhhdCB0aGUgbmFtZSAiTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4iIChhbmQgYWxsCi0gICByZWxhdGVkIGZyaWVuZHMpIG11c3QgYmUgYWNjZXNzaWJsZSBpbiBDLCBDKyssIGFuZCBGb3J0cmFuLiBUaGlzIGlzCi0gICB1bndvcmthYmxlIGlmIHRoZSBiYWNrLWVuZCBGb3J0cmFuIGNvbXBpbGVyIHVzZXMgYWxsIGNhcHMgZm9yIGl0cwotICAgbGlua2VyIHN5bWJvbCBjb252ZW50aW9uIC0tIGl0IHJlc3VsdHMgaW4gdHdvIGZ1bmN0aW9ucyB3aXRoCi0gICBkaWZmZXJlbnQgc2lnbmF0dXJlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSAoaS5lLiwgYm90aCBDIGFuZAotICAgRm9ydHJhbiB1c2UgdGhlIHN5bWJvbCBNUElfVFlQRV9OVUxMX0RFTEVURV9GTikuICBTbyB3ZSBoYXZlIHRvCi0gICAjZGVmaW5lIHRoZSBDIG5hbWVzIHRvIGJlIHNvbWV0aGluZyBlbHNlLCBzbyB0aGF0IHRoZXkgbmFtZXMgYXJlCi0gICAqYWNjZXNzZWQqIHRocm91Z2ggTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4sIGJ1dCB0aGVpciBhY3R1YWwgc3ltYm9sCi0gICBuYW1lIGlzIGRpZmZlcmVudC4KLQotICAgSG93ZXZlciwgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIHdoZW4gdGhlIGZvcnRyYW4gd3JhcHBlciBmdW5jdGlvbnMKLSAgIGFyZSBjb21waWxlZCBpbiBPcGVuIE1QSSwgc28gd2UgZG8gKm5vdCogd2FudCB0aGVzZSAjZGVmaW5lcyBpbgotICAgdGhpcyBjYXNlIChpLmUuLCB3ZSBuZWVkIHRoZSBGb3J0cmFuIHdyYXBwZXIgZnVuY3Rpb24gdG8gYmUKLSAgIGNvbXBpbGVkIGFzIE1QSV9UWVBFX05VTExfREVMRVRFX0ZOKS4gIFNvIGFkZCBzb21lICNpZiBraW5kcyBvZgotICAgcHJvdGVjdGlvbiBmb3IgdGhpcyBjYXNlLiAqLwotCi0jaWYgIWRlZmluZWQoT01QSV9DT01QSUxJTkdfRjc3X1dSQVBQRVJTKQotI2RlZmluZSBNUElfTlVMTF9ERUxFVEVfRk4gT01QSV9DX01QSV9OVUxMX0RFTEVURV9GTgotI2RlZmluZSBNUElfTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfTlVMTF9DT1BZX0ZOCi0jZGVmaW5lIE1QSV9EVVBfRk4gT01QSV9DX01QSV9EVVBfRk4KLQotI2RlZmluZSBNUElfVFlQRV9OVUxMX0RFTEVURV9GTiBPTVBJX0NfTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4KLSNkZWZpbmUgTVBJX1RZUEVfTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfVFlQRV9OVUxMX0NPUFlfRk4KLSNkZWZpbmUgTVBJX1RZUEVfRFVQX0ZOIE9NUElfQ19NUElfVFlQRV9EVVBfRk4KLQotI2RlZmluZSBNUElfQ09NTV9OVUxMX0RFTEVURV9GTiBPTVBJX0NfTVBJX0NPTU1fTlVMTF9ERUxFVEVfRk4KLSNkZWZpbmUgTVBJX0NPTU1fTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfQ09NTV9OVUxMX0NPUFlfRk4KLSNkZWZpbmUgTVBJX0NPTU1fRFVQX0ZOIE9NUElfQ19NUElfQ09NTV9EVVBfRk4KLQotI2RlZmluZSBNUElfV0lOX05VTExfREVMRVRFX0ZOIE9NUElfQ19NUElfV0lOX05VTExfREVMRVRFX0ZOCi0jZGVmaW5lIE1QSV9XSU5fTlVMTF9DT1BZX0ZOIE9NUElfQ19NUElfV0lOX05VTExfQ09QWV9GTgotI2RlZmluZSBNUElfV0lOX0RVUF9GTiBPTVBJX0NfTVBJX1dJTl9EVVBfRk4KLSNlbmRpZgotCi1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX1RZUEVfTlVMTF9ERUxFVEVfRk4oIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVfa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXh0cmFfc3RhdGUgKTsKLU9NUElfREVDTFNQRUMgaW50IE9NUElfQ19NUElfVFlQRV9OVUxMX0NPUFlfRk4oIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dHJhX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmbGFnICk7Ci1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX1RZUEVfRFVQX0ZOKCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9DT01NX05VTExfREVMRVRFX0ZOKCBNUElfQ29tbSBjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9DT01NX05VTExfQ09QWV9GTiggTVBJX0NvbW0gY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21tX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dHJhX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmbGFnICk7Ci1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX0NPTU1fRFVQX0ZOKCBNUElfQ29tbSBjb21tLCBpbnQgY29tbV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9OVUxMX0RFTEVURV9GTiggTVBJX0NvbW0gY29tbSwgaW50IGNvbW1fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9OVUxMX0NPUFlfRk4oIE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9EVVBfRk4oIE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhdHRyaWJ1dGVfdmFsX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotT01QSV9ERUNMU1BFQyBpbnQgT01QSV9DX01QSV9XSU5fTlVMTF9ERUxFVEVfRk4oIE1QSV9XaW4gd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dHJhX3N0YXRlICk7Ci1PTVBJX0RFQ0xTUEVDIGludCBPTVBJX0NfTVBJX1dJTl9OVUxMX0NPUFlfRk4oIE1QSV9XaW4gd2luZG93LCBpbnQgd2luX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXh0cmFfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGF0dHJpYnV0ZV92YWxfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZsYWcgKTsKLU9NUElfREVDTFNQRUMgaW50IE9NUElfQ19NUElfV0lOX0RVUF9GTiggTVBJX1dpbiB3aW5kb3csIGludCB3aW5fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBleHRyYV9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXR0cmlidXRlX3ZhbF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmxhZyApOwotCi0KLS8qCi0gKiBFeHRlcm5hbCB2YXJpYWJsZXMKLSAqLwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfY29tbXVuaWNhdG9yX3Qgb21waV9tcGlfY29tbV93b3JsZDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2NvbW11bmljYXRvcl90IG9tcGlfbXBpX2NvbW1fc2VsZjsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2NvbW11bmljYXRvcl90IG9tcGlfbXBpX2NvbW1fbnVsbDsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZ3JvdXBfdCBvbXBpX21waV9ncm91cF9lbXB0eTsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2dyb3VwX3Qgb21waV9tcGlfZ3JvdXBfbnVsbDsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfcmVxdWVzdF90IG9tcGlfcmVxdWVzdF9udWxsOwotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX251bGw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX21heCwgb21waV9tcGlfb3BfbWluOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfb3BfdCBvbXBpX21waV9vcF9zdW0sIG9tcGlfbXBpX29wX3Byb2Q7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX2xhbmQsIG9tcGlfbXBpX29wX2JhbmQ7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9vcF90IG9tcGlfbXBpX29wX2xvciwgb21waV9tcGlfb3BfYm9yOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfb3BfdCBvbXBpX21waV9vcF9seG9yLCBvbXBpX21waV9vcF9ieG9yOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfb3BfdCBvbXBpX21waV9vcF9tYXhsb2MsIG9tcGlfbXBpX29wX21pbmxvYzsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX29wX3Qgb21waV9tcGlfb3BfcmVwbGFjZTsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9jaGFyLCBvbXBpX21waV9ieXRlOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnQsIG9tcGlfbXBpX2xvZ2ljOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9zaG9ydCwgb21waV9tcGlfbG9uZzsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfZmxvYXQsIG9tcGlfbXBpX2RvdWJsZTsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfbG9uZ19kb3VibGU7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2NwbGV4LCBvbXBpX21waV9wYWNrZWQ7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3NpZ25lZF9jaGFyOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV91bnNpZ25lZF9jaGFyOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV91bnNpZ25lZF9zaG9ydDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfdW5zaWduZWQsIG9tcGlfbXBpX2RhdGF0eXBlX251bGw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3Vuc2lnbmVkX2xvbmcsIG9tcGlfbXBpX2xkYmxjcGxleDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfdWIsIG9tcGlfbXBpX2xiOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9mbG9hdF9pbnQsIG9tcGlfbXBpX2RvdWJsZV9pbnQ7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2xvbmdfaW50LCBvbXBpX21waV8yaW50OwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9zaG9ydF9pbnQsIG9tcGlfbXBpX2RibGNwbGV4OwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyLCBvbXBpX21waV9yZWFsOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9kYmxwcmVjLCBvbXBpX21waV9jaGFyYWN0ZXI7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpXzJyZWFsLCBvbXBpX21waV8yZGJscHJlYzsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfMmludGVnZXIsIG9tcGlfbXBpX2xvbmdkYmxfaW50OwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV93Y2hhciwgb21waV9tcGlfbG9uZ19sb25nX2ludDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfdW5zaWduZWRfbG9uZ19sb25nOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9jeHhfY3BsZXgsIG9tcGlfbXBpX2N4eF9kYmxjcGxleDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfY3h4X2xkYmxjcGxleDsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfY3h4X2Jvb2w7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpXzJjcGxleCwgb21waV9tcGlfMmRibGNwbGV4OwotLyogb3RoZXIgTVBJMiBkYXRhdHlwZXMgKi8KLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyMTsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVIyCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2ludGVnZXIyOwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjQKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfaW50ZWdlcjQ7Ci0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSOAotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyODsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVIxNgotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9pbnRlZ2VyMTY7Ci0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMNAotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZGF0YXR5cGVfdCBvbXBpX21waV9yZWFsNDsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw4Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3JlYWw4OwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDE2Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX3JlYWwxNjsKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw0Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2NvbXBsZXg4OwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDgKLU9NUElfREVDTFNQRUMgZXh0ZXJuIHN0cnVjdCBvbXBpX2RhdGF0eXBlX3Qgb21waV9tcGlfY29tcGxleDE2OwotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDE2Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9kYXRhdHlwZV90IG9tcGlfbXBpX2NvbXBsZXgzMjsKLSNlbmRpZgotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9lcnJoYW5kbGVyX3Qgb21waV9tcGlfZXJyaGFuZGxlcl9udWxsOwotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfZXJyaGFuZGxlcl90IG9tcGlfbXBpX2Vycm9yc19hcmVfZmF0YWw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9lcnJoYW5kbGVyX3Qgb21waV9tcGlfZXJyb3JzX3JldHVybjsKLQotT01QSV9ERUNMU1BFQyBleHRlcm4gc3RydWN0IG9tcGlfd2luX3Qgb21waV9tcGlfd2luX251bGw7Ci1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9maWxlX3Qgb21waV9tcGlfZmlsZV9udWxsOwotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBzdHJ1Y3Qgb21waV9pbmZvX3Qgb21waV9tcGlfaW5mb19udWxsOwotCi1PTVBJX0RFQ0xTUEVDIGV4dGVybiBNUElfRmludCAqTVBJX0ZfU1RBVFVTX0lHTk9SRTsKLU9NUElfREVDTFNQRUMgZXh0ZXJuIE1QSV9GaW50ICpNUElfRl9TVEFUVVNFU19JR05PUkU7Ci0KLS8qCi0gKiBNUEkgcHJlZGVmaW5lZCBoYW5kbGVzCi0gKi8KLSNkZWZpbmUgTVBJX0NPTU1fV09STEQgKCZvbXBpX21waV9jb21tX3dvcmxkKQotI2RlZmluZSBNUElfQ09NTV9TRUxGICgmb21waV9tcGlfY29tbV9zZWxmKQotCi0jZGVmaW5lIE1QSV9HUk9VUF9FTVBUWSAoJm9tcGlfbXBpX2dyb3VwX2VtcHR5KQotCi0jZGVmaW5lIE1QSV9NQVggKCZvbXBpX21waV9vcF9tYXgpCi0jZGVmaW5lIE1QSV9NSU4gKCZvbXBpX21waV9vcF9taW4pCi0jZGVmaW5lIE1QSV9TVU0gKCZvbXBpX21waV9vcF9zdW0pCi0jZGVmaW5lIE1QSV9QUk9EICgmb21waV9tcGlfb3BfcHJvZCkKLSNkZWZpbmUgTVBJX0xBTkQgKCZvbXBpX21waV9vcF9sYW5kKQotI2RlZmluZSBNUElfQkFORCAoJm9tcGlfbXBpX29wX2JhbmQpCi0jZGVmaW5lIE1QSV9MT1IgKCZvbXBpX21waV9vcF9sb3IpCi0jZGVmaW5lIE1QSV9CT1IgKCZvbXBpX21waV9vcF9ib3IpCi0jZGVmaW5lIE1QSV9MWE9SICgmb21waV9tcGlfb3BfbHhvcikKLSNkZWZpbmUgTVBJX0JYT1IgKCZvbXBpX21waV9vcF9ieG9yKQotI2RlZmluZSBNUElfTUFYTE9DICgmb21waV9tcGlfb3BfbWF4bG9jKQotI2RlZmluZSBNUElfTUlOTE9DICgmb21waV9tcGlfb3BfbWlubG9jKQotI2RlZmluZSBNUElfUkVQTEFDRSAoJm9tcGlfbXBpX29wX3JlcGxhY2UpCi0KLS8qIEMgZGF0YXR5cGVzICovCi0jZGVmaW5lIE1QSV9EQVRBVFlQRV9OVUxMICgmb21waV9tcGlfZGF0YXR5cGVfbnVsbCkKLSNkZWZpbmUgTVBJX0JZVEUgKCZvbXBpX21waV9ieXRlKQotI2RlZmluZSBNUElfUEFDS0VEICgmb21waV9tcGlfcGFja2VkKQotI2RlZmluZSBNUElfQ0hBUiAoJm9tcGlfbXBpX2NoYXIpCi0jZGVmaW5lIE1QSV9TSE9SVCAoJm9tcGlfbXBpX3Nob3J0KQotI2RlZmluZSBNUElfSU5UICgmb21waV9tcGlfaW50KQotI2RlZmluZSBNUElfTE9ORyAoJm9tcGlfbXBpX2xvbmcpCi0jZGVmaW5lIE1QSV9GTE9BVCAoJm9tcGlfbXBpX2Zsb2F0KQotI2RlZmluZSBNUElfRE9VQkxFICgmb21waV9tcGlfZG91YmxlKQotI2RlZmluZSBNUElfTE9OR19ET1VCTEUgKCZvbXBpX21waV9sb25nX2RvdWJsZSkKLSNkZWZpbmUgTVBJX1VOU0lHTkVEX0NIQVIgKCZvbXBpX21waV91bnNpZ25lZF9jaGFyKQotI2RlZmluZSBNUElfU0lHTkVEX0NIQVIgKCZvbXBpX21waV9zaWduZWRfY2hhcikKLSNkZWZpbmUgTVBJX1VOU0lHTkVEX1NIT1JUICgmb21waV9tcGlfdW5zaWduZWRfc2hvcnQpCi0jZGVmaW5lIE1QSV9VTlNJR05FRF9MT05HICgmb21waV9tcGlfdW5zaWduZWRfbG9uZykKLSNkZWZpbmUgTVBJX1VOU0lHTkVEICgmb21waV9tcGlfdW5zaWduZWQpCi0jZGVmaW5lIE1QSV9GTE9BVF9JTlQgKCZvbXBpX21waV9mbG9hdF9pbnQpCi0jZGVmaW5lIE1QSV9ET1VCTEVfSU5UICgmb21waV9tcGlfZG91YmxlX2ludCkKLSNkZWZpbmUgTVBJX0xPTkdfRE9VQkxFX0lOVCAoJm9tcGlfbXBpX2xvbmdkYmxfaW50KQotI2RlZmluZSBNUElfTE9OR19JTlQgKCZvbXBpX21waV9sb25nX2ludCkKLSNkZWZpbmUgTVBJX1NIT1JUX0lOVCAoJm9tcGlfbXBpX3Nob3J0X2ludCkKLSNkZWZpbmUgTVBJXzJJTlQgKCZvbXBpX21waV8yaW50KQotI2RlZmluZSBNUElfVUIgKCZvbXBpX21waV91YikKLSNkZWZpbmUgTVBJX0xCICgmb21waV9tcGlfbGIpCi0jZGVmaW5lIE1QSV9XQ0hBUiAoJm9tcGlfbXBpX3djaGFyKQotI2lmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIE1QSV9MT05HX0xPTkdfSU5UICgmb21waV9tcGlfbG9uZ19sb25nX2ludCkKLSNkZWZpbmUgTVBJX0xPTkdfTE9ORyAoJm9tcGlfbXBpX2xvbmdfbG9uZ19pbnQpCi0jZGVmaW5lIE1QSV9VTlNJR05FRF9MT05HX0xPTkcgKCZvbXBpX21waV91bnNpZ25lZF9sb25nX2xvbmcpCi0jZW5kaWYgIC8qIEhBVkVfTE9OR19MT05HICovCi0jZGVmaW5lIE1QSV8yQ09NUExFWCAoJm9tcGlfbXBpXzJjcGxleCkKLSNkZWZpbmUgTVBJXzJET1VCTEVfQ09NUExFWCAoJm9tcGlfbXBpXzJkYmxjcGxleCkKLQotLyogRm9ydHJhbiBkYXRhdHlwZSBiaW5kaW5ncyAqLwotI2RlZmluZSBNUElfQ0hBUkFDVEVSICgmb21waV9tcGlfY2hhcmFjdGVyKQotI2RlZmluZSBNUElfTE9HSUNBTCAoJm9tcGlfbXBpX2xvZ2ljKQotI2RlZmluZSBNUElfSU5URUdFUiAoJm9tcGlfbXBpX2ludGVnZXIpCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjEKLSNkZWZpbmUgTVBJX0lOVEVHRVIxICgmb21waV9tcGlfaW50ZWdlcjEpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMgotI2RlZmluZSBNUElfSU5URUdFUjIgKCZvbXBpX21waV9pbnRlZ2VyMikKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX0lOVEVHRVI0Ci0jZGVmaW5lIE1QSV9JTlRFR0VSNCAoJm9tcGlfbXBpX2ludGVnZXI0KQotI2VuZGlmCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fSU5URUdFUjgKLSNkZWZpbmUgTVBJX0lOVEVHRVI4ICgmb21waV9tcGlfaW50ZWdlcjgpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9JTlRFR0VSMTYKLSNkZWZpbmUgTVBJX0lOVEVHRVIxNiAoJm9tcGlfbXBpX2ludGVnZXIxNikKLSNlbmRpZgotI2RlZmluZSBNUElfUkVBTCAoJm9tcGlfbXBpX3JlYWwpCi0jaWYgT01QSV9IQVZFX0ZPUlRSQU5fUkVBTDQKLSNkZWZpbmUgTVBJX1JFQUw0ICgmb21waV9tcGlfcmVhbDQpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMOAotI2RlZmluZSBNUElfUkVBTDggKCZvbXBpX21waV9yZWFsOCkKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUwxNgotI2RlZmluZSBNUElfUkVBTDE2ICgmb21waV9tcGlfcmVhbDE2KQotI2VuZGlmCi0jZGVmaW5lIE1QSV9ET1VCTEVfUFJFQ0lTSU9OICgmb21waV9tcGlfZGJscHJlYykKLSNkZWZpbmUgTVBJX0NPTVBMRVggKCZvbXBpX21waV9jcGxleCkKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMNAotI2RlZmluZSBNUElfQ09NUExFWDggKCZvbXBpX21waV9jb21wbGV4OCkKLSNlbmRpZgotI2lmIE9NUElfSEFWRV9GT1JUUkFOX1JFQUw4Ci0jZGVmaW5lIE1QSV9DT01QTEVYMTYgKCZvbXBpX21waV9jb21wbGV4MTYpCi0jZW5kaWYKLSNpZiBPTVBJX0hBVkVfRk9SVFJBTl9SRUFMMTYKLSNkZWZpbmUgTVBJX0NPTVBMRVgzMiAoJm9tcGlfbXBpX2NvbXBsZXgzMikKLSNlbmRpZgotI2RlZmluZSBNUElfRE9VQkxFX0NPTVBMRVggKCZvbXBpX21waV9kYmxjcGxleCkKLSNkZWZpbmUgTVBJXzJSRUFMICgmb21waV9tcGlfMnJlYWwpCi0jZGVmaW5lIE1QSV8yRE9VQkxFX1BSRUNJU0lPTiAoJm9tcGlfbXBpXzJkYmxwcmVjKQotI2RlZmluZSBNUElfMklOVEVHRVIgKCZvbXBpX21waV8yaW50ZWdlcikKLQotI2RlZmluZSBNUElfRVJST1JTX0FSRV9GQVRBTCAoJm9tcGlfbXBpX2Vycm9yc19hcmVfZmF0YWwpCi0jZGVmaW5lIE1QSV9FUlJPUlNfUkVUVVJOICgmb21waV9tcGlfZXJyb3JzX3JldHVybikKLQotLyogVHlwZWNsYXNzIGRlZmluaXRpb24gZm9yIE1QSV9UeXBlX21hdGNoX3NpemUgKi8KLSNkZWZpbmUgTVBJX1RZUEVDTEFTU19JTlRFR0VSICAgIDEKLSNkZWZpbmUgTVBJX1RZUEVDTEFTU19SRUFMICAgICAgIDIKLSNkZWZpbmUgTVBJX1RZUEVDTEFTU19DT01QTEVYICAgIDMKLQotLyoKLSAqIEZvciBhcHBsaWNhdGlvbnMgc3RpbGwgdXNpbmcgdGhlIG9sZCBbbm9uLXN0YW5kYXJkXSBST01JTyBjb252ZW50aW9ucwotICovCi0jZGVmaW5lIE1QSU9fUmVxdWVzdCBNUElfUmVxdWVzdAotI2RlZmluZSBNUElPX1Rlc3QgTVBJX1Rlc3QKLSNkZWZpbmUgTVBJT19XYWl0IE1QSV9XYWl0Ci0KLQotLyoKLSAqIE1QSSBBUEkKLSAqLwotCi1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0Fib3J0KE1QSV9Db21tIGNvbW0sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BY2N1bXVsYXRlKHZvaWQgKm9yaWdpbl9hZGRyLCBpbnQgb3JpZ2luX2NvdW50LCBNUElfRGF0YXR5cGUgb3JpZ2luX2RhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRfcmFuaywgTVBJX0FpbnQgdGFyZ2V0X2Rpc3AsIGludCB0YXJnZXRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX09wIG9wLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FkZF9lcnJvcl9jbGFzcyhpbnQgKmVycm9yY2xhc3MpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BZGRfZXJyb3JfY29kZShpbnQgZXJyb3JjbGFzcywgaW50ICplcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BZGRfZXJyb3Jfc3RyaW5nKGludCBlcnJvcmNvZGUsIGNoYXIgKnN0cmluZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FkZHJlc3Modm9pZCAqbG9jYXRpb24sIE1QSV9BaW50ICphZGRyZXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQWxsZ2F0aGVyKHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9BbGxnYXRoZXJ2KHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXNwbHMsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbG9jX21lbShNUElfQWludCBzaXplLCBNUElfSW5mbyBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZXB0cik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbHJlZHVjZSh2b2lkICpzZW5kYnVmLCB2b2lkICpyZWN2YnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9PcCBvcCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbHRvYWxsKHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQWxsdG9hbGx2KHZvaWQgKnNlbmRidWYsIGludCAqc2VuZGNvdW50cywgaW50ICpzZGlzcGxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLCB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJkaXNwbHMsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0FsbHRvYWxsdyh2b2lkICpzZW5kYnVmLCBpbnQgKnNlbmRjb3VudHMsIGludCAqc2Rpc3BscywgTVBJX0RhdGF0eXBlICpzZW5kdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsIGludCAqcmRpc3BscywgTVBJX0RhdGF0eXBlICpyZWN2dHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQXR0cl9kZWxldGUoTVBJX0NvbW0gY29tbSwgaW50IGtleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0F0dHJfZ2V0KE1QSV9Db21tIGNvbW0sIGludCBrZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0F0dHJfcHV0KE1QSV9Db21tIGNvbW0sIGludCBrZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9CYXJyaWVyKE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9CY2FzdCh2b2lkICpidWZmZXIsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0JzZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQnNlbmRfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0J1ZmZlcl9hdHRhY2godm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0J1ZmZlcl9kZXRhY2godm9pZCAqYnVmZmVyLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9DYW5jZWwoTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9DYXJ0X2Nvb3JkcyhNUElfQ29tbSBjb21tLCBpbnQgcmFuaywgaW50IG1heGRpbXMsIGludCAqY29vcmRzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ2FydF9jcmVhdGUoTVBJX0NvbW0gb2xkX2NvbW0sIGludCBuZGltcywgaW50ICpkaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBlcmlvZHMsIGludCByZW9yZGVyLCBNUElfQ29tbSAqY29tbV9jYXJ0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ2FydF9nZXQoTVBJX0NvbW0gY29tbSwgaW50IG1heGRpbXMsIGludCAqZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwZXJpb2RzLCBpbnQgKmNvb3Jkcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRfbWFwKE1QSV9Db21tIGNvbW0sIGludCBuZGltcywgaW50ICpkaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBlcmlvZHMsIGludCAqbmV3cmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRfcmFuayhNUElfQ29tbSBjb21tLCBpbnQgKmNvb3JkcywgaW50ICpyYW5rKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ2FydF9zaGlmdChNUElfQ29tbSBjb21tLCBpbnQgZGlyZWN0aW9uLCBpbnQgZGlzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJhbmtfc291cmNlLCBpbnQgKnJhbmtfZGVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRfc3ViKE1QSV9Db21tIGNvbW0sIGludCAqcmVtYWluX2RpbXMsIE1QSV9Db21tICpuZXdfY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NhcnRkaW1fZ2V0KE1QSV9Db21tIGNvbW0sIGludCAqbmRpbXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9DbG9zZV9wb3J0KGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fYWNjZXB0KGNoYXIgKnBvcnRfbmFtZSwgTVBJX0luZm8gaW5mbywgaW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGNvbW0sIE1QSV9Db21tICpuZXdjb21tKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IE1QSV9Db21tX2MyZihNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9jYWxsX2VycmhhbmRsZXIoTVBJX0NvbW0gY29tbSwgaW50IGVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fY29tcGFyZShNUElfQ29tbSBjb21tMSwgTVBJX0NvbW0gY29tbTIsIGludCAqcmVzdWx0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9jb25uZWN0KGNoYXIgKnBvcnRfbmFtZSwgTVBJX0luZm8gaW5mbywgaW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fY3JlYXRlX2VycmhhbmRsZXIoTVBJX0NvbW1fZXJyaGFuZGxlcl9mbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2NyZWF0ZV9rZXl2YWwoTVBJX0NvbW1fY29weV9hdHRyX2Z1bmN0aW9uICpjb21tX2NvcHlfYXR0cl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uICpjb21tX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb21tX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2NyZWF0ZShNUElfQ29tbSBjb21tLCBNUElfR3JvdXAgZ3JvdXAsIE1QSV9Db21tICpuZXdjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9kZWxldGVfYXR0cihNUElfQ29tbSBjb21tLCBpbnQgY29tbV9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2Rpc2Nvbm5lY3QoTVBJX0NvbW0gKmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX2R1cChNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfQ29tbSBNUElfQ29tbV9mMmMoTVBJX0ZpbnQgY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZnJlZV9rZXl2YWwoaW50ICpjb21tX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZnJlZShNUElfQ29tbSAqY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X2F0dHIoTVBJX0NvbW0gY29tbSwgaW50IGNvbW1fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X2VycmhhbmRsZXIoTVBJX0NvbW0gY29tbSwgTVBJX0VycmhhbmRsZXIgKmVyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X25hbWUoTVBJX0NvbW0gY29tbSwgY2hhciAqY29tbV9uYW1lLCBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fZ2V0X3BhcmVudChNUElfQ29tbSAqcGFyZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9ncm91cChNUElfQ29tbSBjb21tLCBNUElfR3JvdXAgKmdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9qb2luKGludCBmZCwgTVBJX0NvbW0gKmludGVyY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fcmFuayhNUElfQ29tbSBjb21tLCBpbnQgKnJhbmspOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3JlbW90ZV9ncm91cChNUElfQ29tbSBjb21tLCBNUElfR3JvdXAgKmdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9yZW1vdGVfc2l6ZShNUElfQ29tbSBjb21tLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3NldF9hdHRyKE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwgdm9pZCAqYXR0cmlidXRlX3ZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fc2V0X2VycmhhbmRsZXIoTVBJX0NvbW0gY29tbSwgTVBJX0VycmhhbmRsZXIgZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fc2V0X25hbWUoTVBJX0NvbW0gY29tbSwgY2hhciAqY29tbV9uYW1lKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9zaXplKE1QSV9Db21tIGNvbW0sIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0NvbW1fc3Bhd24oY2hhciAqY29tbWFuZCwgY2hhciAqKmFyZ3YsIGludCBtYXhwcm9jcywgTVBJX0luZm8gaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKmludGVyY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFycmF5X29mX2VycmNvZGVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfQ29tbV9zcGF3bl9tdWx0aXBsZShpbnQgY291bnQsIGNoYXIgKiphcnJheV9vZl9jb21tYW5kcywgY2hhciAqKiphcnJheV9vZl9hcmd2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYXJyYXlfb2ZfbWF4cHJvY3MsIE1QSV9JbmZvICphcnJheV9vZl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqaW50ZXJjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYXJyYXlfb2ZfZXJyY29kZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3NwbGl0KE1QSV9Db21tIGNvbW0sIGludCBjb2xvciwgaW50IGtleSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Db21tX3Rlc3RfaW50ZXIoTVBJX0NvbW0gY29tbSwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRGltc19jcmVhdGUoaW50IG5ub2RlcywgaW50IG5kaW1zLCBpbnQgKmRpbXMpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX0VycmhhbmRsZXJfYzJmKE1QSV9FcnJoYW5kbGVyIGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9FcnJoYW5kbGVyX2NyZWF0ZShNUElfSGFuZGxlcl9mdW5jdGlvbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIE1QSV9FcnJoYW5kbGVyIE1QSV9FcnJoYW5kbGVyX2YyYyhNUElfRmludCBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyaGFuZGxlcl9mcmVlKE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyaGFuZGxlcl9nZXQoTVBJX0NvbW0gY29tbSwgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9FcnJoYW5kbGVyX3NldChNUElfQ29tbSBjb21tLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyb3JfY2xhc3MoaW50IGVycm9yY29kZSwgaW50ICplcnJvcmNsYXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRXJyb3Jfc3RyaW5nKGludCBlcnJvcmNvZGUsIGNoYXIgKnN0cmluZywgaW50ICpyZXN1bHRsZW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9FeHNjYW4odm9pZCAqc2VuZGJ1Ziwgdm9pZCAqcmVjdmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX0ZpbGVfYzJmKE1QSV9GaWxlIGZpbGUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbGUgTVBJX0ZpbGVfZjJjKE1QSV9GaW50IGZpbGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2NhbGxfZXJyaGFuZGxlcihNUElfRmlsZSBmaCwgaW50IGVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfY3JlYXRlX2VycmhhbmRsZXIoTVBJX0ZpbGVfZXJyaGFuZGxlcl9mbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NldF9lcnJoYW5kbGVyKCBNUElfRmlsZSBmaWxlLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfZXJyaGFuZGxlciggTVBJX0ZpbGUgZmlsZSwgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX29wZW4oTVBJX0NvbW0gY29tbSwgY2hhciAqZmlsZW5hbWUsIGludCBhbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9JbmZvIGluZm8sIE1QSV9GaWxlICpmaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfY2xvc2UoTVBJX0ZpbGUgKmZoKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9kZWxldGUoY2hhciAqZmlsZW5hbWUsIE1QSV9JbmZvIGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NldF9zaXplKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IHNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3ByZWFsbG9jYXRlKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IHNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2dldF9zaXplKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfZ3JvdXAoTVBJX0ZpbGUgZmgsIE1QSV9Hcm91cCAqZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2dldF9hbW9kZShNUElfRmlsZSBmaCwgaW50ICphbW9kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfc2V0X2luZm8oTVBJX0ZpbGUgZmgsIE1QSV9JbmZvIGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2dldF9pbmZvKE1QSV9GaWxlIGZoLCBNUElfSW5mbyAqaW5mb191c2VkKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9zZXRfdmlldyhNUElfRmlsZSBmaCwgTVBJX09mZnNldCBkaXNwLCBNUElfRGF0YXR5cGUgZXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGZpbGV0eXBlLCBjaGFyICpkYXRhcmVwLCBNUElfSW5mbyBpbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfdmlldyhNUElfRmlsZSBmaCwgTVBJX09mZnNldCAqZGlzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKmV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqZmlsZXR5cGUsIGNoYXIgKmRhdGFyZXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWRfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX2F0X2FsbChNUElfRmlsZSBmaCwgTVBJX09mZnNldCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdChNUElfRmlsZSBmaCwgTVBJX09mZnNldCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdF9hbGwoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2lyZWFkX2F0KE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXdyaXRlX2F0KE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWRfYWxsKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGUoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hbGwoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXJlYWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX2l3cml0ZShNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NlZWsoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfcG9zaXRpb24oTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgKm9mZnNldCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfZ2V0X2J5dGVfb2Zmc2V0KE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX09mZnNldCAqZGlzcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXJlYWRfc2hhcmVkKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfaXdyaXRlX3NoYXJlZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX29yZGVyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfc2Vla19zaGFyZWQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfcG9zaXRpb25fc2hhcmVkKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0ICpvZmZzZXQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3JlYWRfYXRfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX2F0X2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hdF9hbGxfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9hbGxfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGVfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV93cml0ZV9hbGxfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfcmVhZF9vcmRlcmVkX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9yZWFkX29yZGVyZWRfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZF9iZWdpbihNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3dyaXRlX29yZGVyZWRfZW5kKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbGVfZ2V0X3R5cGVfZXh0ZW50KE1QSV9GaWxlIGZoLCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50ICpleHRlbnQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3NldF9hdG9taWNpdHkoTVBJX0ZpbGUgZmgsIGludCBmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRmlsZV9nZXRfYXRvbWljaXR5KE1QSV9GaWxlIGZoLCBpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaWxlX3N5bmMoTVBJX0ZpbGUgZmgpOwotLyoKLSAqIGZpbGUgZnVuY3Rpb25zIGVuZAotICovCi1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0ZpbmFsaXplKHZvaWQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9GaW5hbGl6ZWQoaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfRnJlZV9tZW0odm9pZCAqYmFzZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dhdGhlcih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgcmVjdmNvdW50LCBNUElfRGF0YXR5cGUgcmVjdnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dhdGhlcnYodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCAqcmVjdmNvdW50cywgaW50ICpkaXNwbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldF9hZGRyZXNzKHZvaWQgKmxvY2F0aW9uLCBNUElfQWludCAqYWRkcmVzcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldF9jb3VudChNUElfU3RhdHVzICpzdGF0dXMsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50ICpjb3VudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldF9lbGVtZW50cyhNUElfU3RhdHVzICpzdGF0dXMsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50ICpjb3VudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dldCh2b2lkICpvcmlnaW5fYWRkciwgaW50IG9yaWdpbl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsIGludCB0YXJnZXRfcmFuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IHRhcmdldF9kaXNwLCBpbnQgdGFyZ2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HZXRfcHJvY2Vzc29yX25hbWUoY2hhciAqbmFtZSwgaW50ICpyZXN1bHRsZW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HZXRfdmVyc2lvbihpbnQgKnZlcnNpb24sIGludCAqc3VidmVyc2lvbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyYXBoX2NyZWF0ZShNUElfQ29tbSBjb21tX29sZCwgaW50IG5ub2RlcywgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZWRnZXMsIGludCByZW9yZGVyLCBNUElfQ29tbSAqY29tbV9ncmFwaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyYXBoX2dldChNUElfQ29tbSBjb21tLCBpbnQgbWF4aW5kZXgsIGludCBtYXhlZGdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIGludCAqZWRnZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HcmFwaF9tYXAoTVBJX0NvbW0gY29tbSwgaW50IG5ub2RlcywgaW50ICppbmRleCwgaW50ICplZGdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmV3cmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyYXBoX25laWdoYm9yc19jb3VudChNUElfQ29tbSBjb21tLCBpbnQgcmFuaywgaW50ICpubmVpZ2hib3JzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JhcGhfbmVpZ2hib3JzKE1QSV9Db21tIGNvbW0sIGludCByYW5rLCBpbnQgbWF4bmVpZ2hib3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuZWlnaGJvcnMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HcmFwaGRpbXNfZ2V0KE1QSV9Db21tIGNvbW0sIGludCAqbm5vZGVzLCBpbnQgKm5lZGdlcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyZXF1ZXN0X2NvbXBsZXRlKE1QSV9SZXF1ZXN0IHJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9HcmVxdWVzdF9zdGFydChNUElfR3JlcXVlc3RfcXVlcnlfZnVuY3Rpb24gKnF1ZXJ5X2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JlcXVlc3RfZnJlZV9mdW5jdGlvbiAqZnJlZV9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyZXF1ZXN0X2NhbmNlbF9mdW5jdGlvbiAqY2FuY2VsX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9zdGF0ZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX0dyb3VwX2MyZihNUElfR3JvdXAgZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Hcm91cF9jb21wYXJlKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsIGludCAqcmVzdWx0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfZGlmZmVyZW5jZShNUElfR3JvdXAgZ3JvdXAxLCBNUElfR3JvdXAgZ3JvdXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Hcm91cF9leGNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCAqcmFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfR3JvdXAgTVBJX0dyb3VwX2YyYyhNUElfRmludCBncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX2ZyZWUoTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX2luY2woTVBJX0dyb3VwIGdyb3VwLCBpbnQgbiwgaW50ICpyYW5rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgKm5ld2dyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfaW50ZXJzZWN0aW9uKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgKm5ld2dyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfcmFuZ2VfZXhjbChNUElfR3JvdXAgZ3JvdXAsIGludCBuLCBpbnQgcmFuZ2VzW11bM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX3JhbmdlX2luY2woTVBJX0dyb3VwIGdyb3VwLCBpbnQgbiwgaW50IHJhbmdlc1tdWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Hcm91cF9yYW5rKE1QSV9Hcm91cCBncm91cCwgaW50ICpyYW5rKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfR3JvdXBfc2l6ZShNUElfR3JvdXAgZ3JvdXAsIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX3RyYW5zbGF0ZV9yYW5rcyhNUElfR3JvdXAgZ3JvdXAxLCBpbnQgbiwgaW50ICpyYW5rczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgZ3JvdXAyLCBpbnQgKnJhbmtzMik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0dyb3VwX3VuaW9uKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JYnNlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRmludCBNUElfSW5mb19jMmYoTVBJX0luZm8gaW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luZm9fY3JlYXRlKE1QSV9JbmZvICppbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW5mb19kZWxldGUoTVBJX0luZm8gaW5mbywgY2hhciAqa2V5KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW5mb19kdXAoTVBJX0luZm8gaW5mbywgTVBJX0luZm8gKm5ld2luZm8pOwotT01QSV9ERUNMU1BFQyAgTVBJX0luZm8gTVBJX0luZm9fZjJjKE1QSV9GaW50IGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JbmZvX2ZyZWUoTVBJX0luZm8gKmluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JbmZvX2dldChNUElfSW5mbyBpbmZvLCBjaGFyICprZXksIGludCB2YWx1ZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsdWUsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luZm9fZ2V0X25rZXlzKE1QSV9JbmZvIGluZm8sIGludCAqbmtleXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9JbmZvX2dldF9udGhrZXkoTVBJX0luZm8gaW5mbywgaW50IG4sIGNoYXIgKmtleSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luZm9fZ2V0X3ZhbHVlbGVuKE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSwgaW50ICp2YWx1ZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW5mb19zZXQoTVBJX0luZm8gaW5mbywgY2hhciAqa2V5LCBjaGFyICp2YWx1ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0luaXQoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jbml0aWFsaXplZChpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jbml0X3RocmVhZChpbnQgKmFyZ2MsIGNoYXIgKioqYXJndiwgaW50IHJlcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnByb3ZpZGVkKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW50ZXJjb21tX2NyZWF0ZShNUElfQ29tbSBsb2NhbF9jb21tLCBpbnQgbG9jYWxfbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGJyaWRnZV9jb21tLCBpbnQgcmVtb3RlX2xlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSAqbmV3aW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSW50ZXJjb21tX21lcmdlKE1QSV9Db21tIGludGVyY29tbSwgaW50IGhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSAqbmV3aW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSXByb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0lyZWN2KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfSXJzZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Jc3NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0lzX3RocmVhZF9tYWluKGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0tleXZhbF9jcmVhdGUoTVBJX0NvcHlfZnVuY3Rpb24gKmNvcHlfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RlbGV0ZV9mdW5jdGlvbiAqZGVsZXRlX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqa2V5dmFsLCB2b2lkICpleHRyYV9zdGF0ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX0tleXZhbF9mcmVlKGludCAqa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfTG9va3VwX25hbWUoY2hhciAqc2VydmljZV9uYW1lLCBNUElfSW5mbyBpbmZvLCBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX09wX2MyZihNUElfT3Agb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9PcF9jcmVhdGUoTVBJX1VzZXJfZnVuY3Rpb24gKmZ1bmN0aW9uLCBpbnQgY29tbXV0ZSwgTVBJX09wICpvcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX09wZW5fcG9ydChNUElfSW5mbyBpbmZvLCBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgTVBJX09wIE1QSV9PcF9mMmMoTVBJX0ZpbnQgb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9PcF9mcmVlKE1QSV9PcCAqb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QYWNrX2V4dGVybmFsKGNoYXIgKmRhdGFyZXAsIHZvaWQgKmluYnVmLCBpbnQgaW5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIHZvaWQgKm91dGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCBvdXRzaXplLCBNUElfQWludCAqcG9zaXRpb24pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QYWNrX2V4dGVybmFsX3NpemUoY2hhciAqZGF0YXJlcCwgaW50IGluY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9BaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfUGFjayh2b2lkICppbmJ1ZiwgaW50IGluY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRidWYsIGludCBvdXRzaXplLCBpbnQgKnBvc2l0aW9uLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfUGFja19zaXplKGludCBpbmNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QY29udHJvbChjb25zdCBpbnQgbGV2ZWwsIC4uLik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1Byb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1B1Ymxpc2hfbmFtZShjaGFyICpzZXJ2aWNlX25hbWUsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9QdXQodm9pZCAqb3JpZ2luX2FkZHIsIGludCBvcmlnaW5fY291bnQsIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0X3JhbmssIE1QSV9BaW50IHRhcmdldF9kaXNwLCBpbnQgdGFyZ2V0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9RdWVyeV90aHJlYWQoaW50ICpwcm92aWRlZCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlY3ZfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9SZWN2KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfUmVkdWNlKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX09wIG9wLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlZHVjZV9zY2F0dGVyKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCAqcmVjdmNvdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9SZWdpc3Rlcl9kYXRhcmVwKGNoYXIgKmRhdGFyZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfY29udmVyc2lvbl9mdW5jdGlvbiAqcmVhZF9jb252ZXJzaW9uX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhcmVwX2NvbnZlcnNpb25fZnVuY3Rpb24gKndyaXRlX2NvbnZlcnNpb25fZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfZXh0ZW50X2Z1bmN0aW9uICpkdHlwZV9maWxlX2V4dGVudF9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYV9zdGF0ZSk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRmludCBNUElfUmVxdWVzdF9jMmYoTVBJX1JlcXVlc3QgcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfUmVxdWVzdCBNUElfUmVxdWVzdF9mMmMoTVBJX0ZpbnQgcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlcXVlc3RfZnJlZShNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1JlcXVlc3RfZ2V0X3N0YXR1cyhNUElfUmVxdWVzdCByZXF1ZXN0LCBpbnQgKmZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Sc2VuZCh2b2lkICppYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9Sc2VuZF9pbml0KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9TY2FuKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9PcCBvcCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NjYXR0ZXIodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NjYXR0ZXJ2KHZvaWQgKnNlbmRidWYsIGludCAqc2VuZGNvdW50cywgaW50ICpkaXNwbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NlbmRfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NlbmRyZWN2KHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCBzZW5kdGFnLCB2b2lkICpyZWN2YnVmLCBpbnQgcmVjdmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tLCAgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfU2VuZHJlY3ZfcmVwbGFjZSh2b2lkICogYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHNlbmR0YWcsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NzZW5kX2luaXQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHRhZywgTVBJX0NvbW0gY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1NzZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfU3RhcnQoTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9TdGFydGFsbChpbnQgY291bnQsIE1QSV9SZXF1ZXN0ICphcnJheV9vZl9yZXF1ZXN0cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1N0YXR1c19jMmYoTVBJX1N0YXR1cyAqY19zdGF0dXMsIE1QSV9GaW50ICpmX3N0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1N0YXR1c19mMmMoTVBJX0ZpbnQgKmZfc3RhdHVzLCBNUElfU3RhdHVzICpjX3N0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1N0YXR1c19zZXRfY2FuY2VsbGVkKE1QSV9TdGF0dXMgKnN0YXR1cywgaW50IGZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9TdGF0dXNfc2V0X2VsZW1lbnRzKE1QSV9TdGF0dXMgKnN0YXR1cywgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1Rlc3RhbGwoaW50IGNvdW50LCBNUElfUmVxdWVzdCBhcnJheV9vZl9yZXF1ZXN0c1tdLCBpbnQgKmZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyBhcnJheV9vZl9zdGF0dXNlc1tdKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVGVzdGFueShpbnQgY291bnQsIE1QSV9SZXF1ZXN0IGFycmF5X29mX3JlcXVlc3RzW10sIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmbGFnLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UZXN0KE1QSV9SZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgKmZsYWcsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1Rlc3RfY2FuY2VsbGVkKE1QSV9TdGF0dXMgKnN0YXR1cywgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVGVzdHNvbWUoaW50IGluY291bnQsIE1QSV9SZXF1ZXN0IGFycmF5X29mX3JlcXVlc3RzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0Y291bnQsIGludCBhcnJheV9vZl9pbmRpY2VzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9TdGF0dXMgYXJyYXlfb2Zfc3RhdHVzZXNbXSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1RvcG9fdGVzdChNUElfQ29tbSBjb21tLCBpbnQgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRmludCBNUElfVHlwZV9jMmYoTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jb21taXQoTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jb250aWd1b3VzKGludCBjb3VudCwgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2NyZWF0ZV9kYXJyYXkoaW50IHNpemUsIGludCByYW5rLCBpbnQgbmRpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3NpemVfYXJyYXlbXSwgaW50IGRpc3RyaWJfYXJyYXlbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXJnX2FycmF5W10sIGludCBwc2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfY3JlYXRlX2Y5MF9jb21wbGV4KGludCBwLCBpbnQgciwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfZjkwX2ludGVnZXIoaW50IHIsIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfY3JlYXRlX2Y5MF9yZWFsKGludCBwLCBpbnQgciwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfY3JlYXRlX2h2ZWN0b3IoaW50IGNvdW50LCBpbnQgYmxvY2tsZW5ndGgsIE1QSV9BaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2NyZWF0ZV9rZXl2YWwoTVBJX1R5cGVfY29weV9hdHRyX2Z1bmN0aW9uICp0eXBlX2NvcHlfYXR0cl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9UeXBlX2RlbGV0ZV9hdHRyX2Z1bmN0aW9uICp0eXBlX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2NyZWF0ZV9pbmRleGVkX2Jsb2NrKGludCBjb3VudCwgaW50IGJsb2NrbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheV9vZl9kaXNwbGFjZW1lbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfc3RydWN0KGludCBjb3VudCwgaW50IGFycmF5X29mX2Jsb2NrX2xlbmd0aHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBhcnJheV9vZl90eXBlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfc3ViYXJyYXkoaW50IG5kaW1zLCBpbnQgc2l6ZV9hcnJheVtdLCBpbnQgc3Vic2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYXJyYXlbXSwgaW50IG9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9jcmVhdGVfcmVzaXplZChNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0FpbnQgbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgZXh0ZW50LCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2RlbGV0ZV9hdHRyKE1QSV9EYXRhdHlwZSB0eXBlLCBpbnQgdHlwZV9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2R1cChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9leHRlbnQoTVBJX0RhdGF0eXBlIHR5cGUsIE1QSV9BaW50ICpleHRlbnQpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2ZyZWUoTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9mcmVlX2tleXZhbChpbnQgKnR5cGVfa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIE1QSV9EYXRhdHlwZSBNUElfVHlwZV9mMmMoTVBJX0ZpbnQgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2dldF9hdHRyKE1QSV9EYXRhdHlwZSB0eXBlLCBpbnQgdHlwZV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbCwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9nZXRfY29udGVudHMoTVBJX0RhdGF0eXBlIG10eXBlLCBpbnQgbWF4X2ludGVnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2FkZHJlc3NlcywgaW50IG1heF9kYXRhdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheV9vZl9pbnRlZ2Vyc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCBhcnJheV9vZl9hZGRyZXNzZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGFycmF5X29mX2RhdGF0eXBlc1tdKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9nZXRfZW52ZWxvcGUoTVBJX0RhdGF0eXBlIHR5cGUsIGludCAqbnVtX2ludGVnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV9hZGRyZXNzZXMsIGludCAqbnVtX2RhdGF0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb21iaW5lcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfZ2V0X2V4dGVudChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0FpbnQgKmxiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgKmV4dGVudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfZ2V0X25hbWUoTVBJX0RhdGF0eXBlIHR5cGUsIGNoYXIgKnR5cGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfZ2V0X3RydWVfZXh0ZW50KE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX0FpbnQgKnRydWVfbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50ICp0cnVlX2V4dGVudCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2h2ZWN0b3IoaW50IGNvdW50LCBpbnQgYmxvY2tsZW5ndGgsIE1QSV9BaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX2luZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfbGIoTVBJX0RhdGF0eXBlIHR5cGUsIE1QSV9BaW50ICpsYik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfbWF0Y2hfc2l6ZShpbnQgdHlwZWNsYXNzLCBpbnQgc2l6ZSwgTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9zZXRfYXR0cihNUElfRGF0YXR5cGUgdHlwZSwgaW50IHR5cGVfa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmF0dHJfdmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9zZXRfbmFtZShNUElfRGF0YXR5cGUgdHlwZSwgY2hhciAqdHlwZV9uYW1lKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV9zaXplKE1QSV9EYXRhdHlwZSB0eXBlLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9UeXBlX3N0cnVjdChpbnQgY291bnQsIGludCBhcnJheV9vZl9ibG9ja2xlbmd0aHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgYXJyYXlfb2ZfdHlwZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVHlwZV91YihNUElfRGF0YXR5cGUgbXR5cGUsIE1QSV9BaW50ICp1Yik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1R5cGVfdmVjdG9yKGludCBjb3VudCwgaW50IGJsb2NrbGVuZ3RoLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfVW5wYWNrKHZvaWQgKmluYnVmLCBpbnQgaW5zaXplLCBpbnQgKnBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0YnVmLCBpbnQgb3V0Y291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9VbnB1Ymxpc2hfbmFtZShjaGFyICpzZXJ2aWNlX25hbWUsIE1QSV9JbmZvIGluZm8sIGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1VucGFja19leHRlcm5hbCAoY2hhciAqZGF0YXJlcCwgdm9pZCAqaW5idWYsIE1QSV9BaW50IGluc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCAqcG9zaXRpb24sIHZvaWQgKm91dGJ1ZiwgaW50IG91dGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dhaXRhbGwoaW50IGNvdW50LCBNUElfUmVxdWVzdCAqYXJyYXlfb2ZfcmVxdWVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XYWl0YW55KGludCBjb3VudCwgTVBJX1JlcXVlc3QgKmFycmF5X29mX3JlcXVlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dhaXQoTVBJX1JlcXVlc3QgKnJlcXVlc3QsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dhaXRzb21lKGludCBpbmNvdW50LCBNUElfUmVxdWVzdCAqYXJyYXlfb2ZfcmVxdWVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0Y291bnQsIGludCAqYXJyYXlfb2ZfaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgTVBJX1dpbl9jMmYoTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fY2FsbF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBpbnQgZXJyb3Jjb2RlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2NvbXBsZXRlKE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2NyZWF0ZSh2b2lkICpiYXNlLCBNUElfQWludCBzaXplLCBpbnQgZGlzcF91bml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9JbmZvIGluZm8sIE1QSV9Db21tIGNvbW0sIE1QSV9XaW4gKndpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcihNUElfV2luX2VycmhhbmRsZXJfZm4gKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fY3JlYXRlX2tleXZhbChNUElfV2luX2NvcHlfYXR0cl9mdW5jdGlvbiAqd2luX2NvcHlfYXR0cl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1dpbl9kZWxldGVfYXR0cl9mdW5jdGlvbiAqd2luX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKndpbl9rZXl2YWwsIHZvaWQgKmV4dHJhX3N0YXRlKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2RlbGV0ZV9hdHRyKE1QSV9XaW4gd2luLCBpbnQgd2luX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfV2luIE1QSV9XaW5fZjJjKE1QSV9GaW50IHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9mZW5jZShpbnQgYXNzZXJ0LCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9mcmVlKE1QSV9XaW4gKndpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9mcmVlX2tleXZhbChpbnQgKndpbl9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fZ2V0X2F0dHIoTVBJX1dpbiB3aW4sIGludCB3aW5fa2V5dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbCwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX2dldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9nZXRfZ3JvdXAoTVBJX1dpbiB3aW4sIE1QSV9Hcm91cCAqZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fZ2V0X25hbWUoTVBJX1dpbiB3aW4sIGNoYXIgKndpbl9uYW1lLCBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9sb2NrKGludCBsb2NrX3R5cGUsIGludCByYW5rLCBpbnQgYXNzZXJ0LCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9wb3N0KE1QSV9Hcm91cCBncm91cCwgaW50IGFzc2VydCwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IE1QSV9XaW5fc2V0X2F0dHIoTVBJX1dpbiB3aW4sIGludCB3aW5fa2V5dmFsLCB2b2lkICphdHRyaWJ1dGVfdmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3NldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3NldF9uYW1lKE1QSV9XaW4gd2luLCBjaGFyICp3aW5fbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl9zdGFydChNUElfR3JvdXAgZ3JvdXAsIGludCBhc3NlcnQsIE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3Rlc3QoTVBJX1dpbiB3aW4sIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgTVBJX1dpbl91bmxvY2soaW50IHJhbmssIE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBNUElfV2luX3dhaXQoTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgZG91YmxlIE1QSV9XdGljayh2b2lkKTsKLU9NUElfREVDTFNQRUMgIGRvdWJsZSBNUElfV3RpbWUodm9pZCk7Ci0KLQotICAvKgotICAgKiBQcm9maWxpbmcgTVBJIEFQSQotICAgKi8KLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0Fib3J0KE1QSV9Db21tIGNvbW0sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQWNjdW11bGF0ZSh2b2lkICpvcmlnaW5fYWRkciwgaW50IG9yaWdpbl9jb3VudCwgTVBJX0RhdGF0eXBlIG9yaWdpbl9kYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF9yYW5rLCBNUElfQWludCB0YXJnZXRfZGlzcCwgaW50IHRhcmdldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHRhcmdldF9kYXRhdHlwZSwgTVBJX09wIG9wLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BZGRfZXJyb3JfY2xhc3MoaW50ICplcnJvcmNsYXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FkZF9lcnJvcl9jb2RlKGludCBlcnJvcmNsYXNzLCBpbnQgKmVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BZGRfZXJyb3Jfc3RyaW5nKGludCBlcnJvcmNvZGUsIGNoYXIgKnN0cmluZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BZGRyZXNzKHZvaWQgKmxvY2F0aW9uLCBNUElfQWludCAqYWRkcmVzcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BbGxnYXRoZXIodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FsbGdhdGhlcnYodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGlzcGxzLCBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQWxsb2NfbWVtKE1QSV9BaW50IHNpemUsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZXB0cik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BbGxyZWR1Y2Uodm9pZCAqc2VuZGJ1Ziwgdm9pZCAqcmVjdmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX09wIG9wLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FsbHRvYWxsKHZvaWQgKnNlbmRidWYsIGludCBzZW5kY291bnQsIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQWxsdG9hbGx2KHZvaWQgKnNlbmRidWYsIGludCAqc2VuZGNvdW50cywgaW50ICpzZGlzcGxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwgdm9pZCAqcmVjdmJ1ZiwgaW50ICpyZWN2Y291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcmRpc3BscywgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0FsbHRvYWxsdyh2b2lkICpzZW5kYnVmLCBpbnQgKnNlbmRjb3VudHMsIGludCAqc2Rpc3BscywgTVBJX0RhdGF0eXBlICpzZW5kdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCAqcmVjdmNvdW50cywgaW50ICpyZGlzcGxzLCBNUElfRGF0YXR5cGUgKnJlY3Z0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BdHRyX2RlbGV0ZShNUElfQ29tbSBjb21tLCBpbnQga2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0F0dHJfZ2V0KE1QSV9Db21tIGNvbW0sIGludCBrZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9BdHRyX3B1dChNUElfQ29tbSBjb21tLCBpbnQga2V5dmFsLCB2b2lkICphdHRyaWJ1dGVfdmFsKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0JhcnJpZXIoTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9CY2FzdCh2b2lkICpidWZmZXIsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvb3QsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQnNlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0JzZW5kX2luaXQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0J1ZmZlcl9hdHRhY2godm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9CdWZmZXJfZGV0YWNoKHZvaWQgKmJ1ZmZlciwgaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NhbmNlbChNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X2Nvb3JkcyhNUElfQ29tbSBjb21tLCBpbnQgcmFuaywgaW50IG1heGRpbXMsIGludCAqY29vcmRzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NhcnRfY3JlYXRlKE1QSV9Db21tIG9sZF9jb21tLCBpbnQgbmRpbXMsIGludCAqZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGVyaW9kcywgaW50IHJlb3JkZXIsIE1QSV9Db21tICpjb21tX2NhcnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ2FydF9nZXQoTVBJX0NvbW0gY29tbSwgaW50IG1heGRpbXMsIGludCAqZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGVyaW9kcywgaW50ICpjb29yZHMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ2FydF9tYXAoTVBJX0NvbW0gY29tbSwgaW50IG5kaW1zLCBpbnQgKmRpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBlcmlvZHMsIGludCAqbmV3cmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X3JhbmsoTVBJX0NvbW0gY29tbSwgaW50ICpjb29yZHMsIGludCAqcmFuayk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X3NoaWZ0KE1QSV9Db21tIGNvbW0sIGludCBkaXJlY3Rpb24sIGludCBkaXNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJhbmtfc291cmNlLCBpbnQgKnJhbmtfZGVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DYXJ0X3N1YihNUElfQ29tbSBjb21tLCBpbnQgKnJlbWFpbl9kaW1zLCBNUElfQ29tbSAqbmV3X2NvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ2FydGRpbV9nZXQoTVBJX0NvbW0gY29tbSwgaW50ICpuZGltcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9DbG9zZV9wb3J0KGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2FjY2VwdChjaGFyICpwb3J0X25hbWUsIE1QSV9JbmZvIGluZm8sIGludCByb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9Db21tX2MyZihNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fY2FsbF9lcnJoYW5kbGVyKE1QSV9Db21tIGNvbW0sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jb21wYXJlKE1QSV9Db21tIGNvbW0xLCBNUElfQ29tbSBjb21tMiwgaW50ICpyZXN1bHQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jb25uZWN0KGNoYXIgKnBvcnRfbmFtZSwgTVBJX0luZm8gaW5mbywgaW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jcmVhdGVfZXJyaGFuZGxlcihNUElfQ29tbV9lcnJoYW5kbGVyX2ZuICpmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0VycmhhbmRsZXIgKmVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jcmVhdGVfa2V5dmFsKE1QSV9Db21tX2NvcHlfYXR0cl9mdW5jdGlvbiAqY29tbV9jb3B5X2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW1fZGVsZXRlX2F0dHJfZnVuY3Rpb24gKmNvbW1fZGVsZXRlX2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb21tX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9jcmVhdGUoTVBJX0NvbW0gY29tbSwgTVBJX0dyb3VwIGdyb3VwLCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2RlbGV0ZV9hdHRyKE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2Rpc2Nvbm5lY3QoTVBJX0NvbW0gKmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9kdXAoTVBJX0NvbW0gY29tbSwgTVBJX0NvbW0gKm5ld2NvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0NvbW0gUE1QSV9Db21tX2YyYyhNUElfRmludCBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fZnJlZV9rZXl2YWwoaW50ICpjb21tX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2ZyZWUoTVBJX0NvbW0gKmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9nZXRfYXR0cihNUElfQ29tbSBjb21tLCBpbnQgY29tbV9rZXl2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmF0dHJpYnV0ZV92YWwsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2dldF9lcnJoYW5kbGVyKE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyICplcmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9nZXRfbmFtZShNUElfQ29tbSBjb21tLCBjaGFyICpjb21tX25hbWUsIGludCAqcmVzdWx0bGVuKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fZ2V0X3BhcmVudChNUElfQ29tbSAqcGFyZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fZ3JvdXAoTVBJX0NvbW0gY29tbSwgTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX2pvaW4oaW50IGZkLCBNUElfQ29tbSAqaW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fcmFuayhNUElfQ29tbSBjb21tLCBpbnQgKnJhbmspOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9yZW1vdGVfZ3JvdXAoTVBJX0NvbW0gY29tbSwgTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3JlbW90ZV9zaXplKE1QSV9Db21tIGNvbW0sIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3NldF9hdHRyKE1QSV9Db21tIGNvbW0sIGludCBjb21tX2tleXZhbCwgdm9pZCAqYXR0cmlidXRlX3ZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3NldF9lcnJoYW5kbGVyKE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyIGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9zZXRfbmFtZShNUElfQ29tbSBjb21tLCBjaGFyICpjb21tX25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfQ29tbV9zaXplKE1QSV9Db21tIGNvbW0sIGludCAqc2l6ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3NwYXduKGNoYXIgKmNvbW1hbmQsIGNoYXIgKiphcmd2LCBpbnQgbWF4cHJvY3MsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqaW50ZXJjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFycmF5X29mX2VycmNvZGVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fc3Bhd25fbXVsdGlwbGUoaW50IGNvdW50LCBjaGFyICoqYXJyYXlfb2ZfY29tbWFuZHMsIGNoYXIgKioqYXJyYXlfb2ZfYXJndiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICphcnJheV9vZl9tYXhwcm9jcywgTVBJX0luZm8gKmFycmF5X29mX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tLCBNUElfQ29tbSAqaW50ZXJjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFycmF5X29mX2VycmNvZGVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0NvbW1fc3BsaXQoTVBJX0NvbW0gY29tbSwgaW50IGNvbG9yLCBpbnQga2V5LCBNUElfQ29tbSAqbmV3Y29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Db21tX3Rlc3RfaW50ZXIoTVBJX0NvbW0gY29tbSwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0RpbXNfY3JlYXRlKGludCBubm9kZXMsIGludCBuZGltcywgaW50ICpkaW1zKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IFBNUElfRXJyaGFuZGxlcl9jMmYoTVBJX0VycmhhbmRsZXIgZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9FcnJoYW5kbGVyX2NyZWF0ZShNUElfSGFuZGxlcl9mdW5jdGlvbiAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBNUElfRXJyaGFuZGxlciBQTVBJX0VycmhhbmRsZXJfZjJjKE1QSV9GaW50IGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRXJyaGFuZGxlcl9mcmVlKE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0VycmhhbmRsZXJfZ2V0KE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0VycmhhbmRsZXJfc2V0KE1QSV9Db21tIGNvbW0sIE1QSV9FcnJoYW5kbGVyIGVycmhhbmRsZXIpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRXJyb3JfY2xhc3MoaW50IGVycm9yY29kZSwgaW50ICplcnJvcmNsYXNzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0Vycm9yX3N0cmluZyhpbnQgZXJyb3Jjb2RlLCBjaGFyICpzdHJpbmcsIGludCAqcmVzdWx0bGVuKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0V4c2Nhbih2b2lkICpzZW5kYnVmLCB2b2lkICpyZWN2YnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9GaWxlX2MyZihNUElfRmlsZSBmaWxlKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaWxlIFBNUElfRmlsZV9mMmMoTVBJX0ZpbnQgZmlsZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2NhbGxfZXJyaGFuZGxlcihNUElfRmlsZSBmaCwgaW50IGVycm9yY29kZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2NyZWF0ZV9lcnJoYW5kbGVyKE1QSV9GaWxlX2VycmhhbmRsZXJfZm4gKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NldF9lcnJoYW5kbGVyKCBNUElfRmlsZSBmaWxlLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X2VycmhhbmRsZXIoIE1QSV9GaWxlIGZpbGUsIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfb3BlbihNUElfQ29tbSBjb21tLCBjaGFyICpmaWxlbmFtZSwgaW50IGFtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9JbmZvIGluZm8sIE1QSV9GaWxlICpmaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2Nsb3NlKE1QSV9GaWxlICpmaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2RlbGV0ZShjaGFyICpmaWxlbmFtZSwgTVBJX0luZm8gaW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NldF9zaXplKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IHNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9wcmVhbGxvY2F0ZShNUElfRmlsZSBmaCwgTVBJX09mZnNldCBzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X3NpemUoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfZ3JvdXAoTVBJX0ZpbGUgZmgsIE1QSV9Hcm91cCAqZ3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfYW1vZGUoTVBJX0ZpbGUgZmgsIGludCAqYW1vZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9zZXRfaW5mbyhNUElfRmlsZSBmaCwgTVBJX0luZm8gaW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2dldF9pbmZvKE1QSV9GaWxlIGZoLCBNUElfSW5mbyAqaW5mb191c2VkKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfc2V0X3ZpZXcoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgZGlzcCwgTVBJX0RhdGF0eXBlIGV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZmlsZXR5cGUsIGNoYXIgKmRhdGFyZXAsIE1QSV9JbmZvIGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfdmlldyhNUElfRmlsZSBmaCwgTVBJX09mZnNldCAqZGlzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpldHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpmaWxldHlwZSwgY2hhciAqZGF0YXJlcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXRfYWxsKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9hdF9hbGwoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfaXJlYWRfYXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2l3cml0ZV9hdChNUElfRmlsZSBmaCwgTVBJX09mZnNldCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfcmVhZF9hbGwoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3dyaXRlKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9hbGwoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9pcmVhZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9pd3JpdGUoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NlZWsoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X3Bvc2l0aW9uKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0ICpvZmZzZXQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfYnl0ZV9vZmZzZXQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX09mZnNldCAqZGlzcCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfc2hhcmVkKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9pcmVhZF9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2l3cml0ZV9zaGFyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9yZWFkX29yZGVyZWQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9vcmRlcmVkKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3NlZWtfc2hhcmVkKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgaW50IHdoZW5jZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX2dldF9wb3NpdGlvbl9zaGFyZWQoTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgKm9mZnNldCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXRfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCBNUElfT2Zmc2V0IG9mZnNldCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfYXRfYWxsX2VuZChNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV93cml0ZV9hdF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIE1QSV9PZmZzZXQgb2Zmc2V0LCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3dyaXRlX2F0X2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfcmVhZF9hbGxfYmVnaW4oTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9yZWFkX2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfYWxsX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3dyaXRlX2FsbF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfcmVhZF9vcmRlcmVkX2JlZ2luKE1QSV9GaWxlIGZoLCB2b2lkICpidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GaWxlX3JlYWRfb3JkZXJlZF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZF9iZWdpbihNUElfRmlsZSBmaCwgdm9pZCAqYnVmLCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfd3JpdGVfb3JkZXJlZF9lbmQoTVBJX0ZpbGUgZmgsIHZvaWQgKmJ1ZiwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfZ2V0X3R5cGVfZXh0ZW50KE1QSV9GaWxlIGZoLCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCAqZXh0ZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbGVfc2V0X2F0b21pY2l0eShNUElfRmlsZSBmaCwgaW50IGZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9nZXRfYXRvbWljaXR5KE1QSV9GaWxlIGZoLCBpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmlsZV9zeW5jKE1QSV9GaWxlIGZoKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ZpbmFsaXplKHZvaWQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfRmluYWxpemVkKGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9GcmVlX21lbSh2b2lkICpiYXNlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dhdGhlcih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwgTVBJX0RhdGF0eXBlIHJlY3Z0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb290LCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dhdGhlcnYodm9pZCAqc2VuZGJ1ZiwgaW50IHNlbmRjb3VudCwgTVBJX0RhdGF0eXBlIHNlbmR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsIGludCAqZGlzcGxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIGludCByb290LCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dldF9hZGRyZXNzKHZvaWQgKmxvY2F0aW9uLCBNUElfQWludCAqYWRkcmVzcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HZXRfY291bnQoTVBJX1N0YXR1cyAqc3RhdHVzLCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCAqY291bnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR2V0X2VsZW1lbnRzKE1QSV9TdGF0dXMgKnN0YXR1cywgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR2V0KHZvaWQgKm9yaWdpbl9hZGRyLCBpbnQgb3JpZ2luX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsIGludCB0YXJnZXRfcmFuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCB0YXJnZXRfZGlzcCwgaW50IHRhcmdldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgdGFyZ2V0X2RhdGF0eXBlLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HZXRfcHJvY2Vzc29yX25hbWUoY2hhciAqbmFtZSwgaW50ICpyZXN1bHRsZW4pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR2V0X3ZlcnNpb24oaW50ICp2ZXJzaW9uLCBpbnQgKnN1YnZlcnNpb24pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JhcGhfY3JlYXRlKE1QSV9Db21tIGNvbW1fb2xkLCBpbnQgbm5vZGVzLCBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZWRnZXMsIGludCByZW9yZGVyLCBNUElfQ29tbSAqY29tbV9ncmFwaCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HcmFwaF9nZXQoTVBJX0NvbW0gY29tbSwgaW50IG1heGluZGV4LCBpbnQgbWF4ZWRnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwgaW50ICplZGdlcyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9HcmFwaF9tYXAoTVBJX0NvbW0gY29tbSwgaW50IG5ub2RlcywgaW50ICppbmRleCwgaW50ICplZGdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5ld3JhbmspOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JhcGhfbmVpZ2hib3JzX2NvdW50KE1QSV9Db21tIGNvbW0sIGludCByYW5rLCBpbnQgKm5uZWlnaGJvcnMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JhcGhfbmVpZ2hib3JzKE1QSV9Db21tIGNvbW0sIGludCByYW5rLCBpbnQgbWF4bmVpZ2hib3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmVpZ2hib3JzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyYXBoZGltc19nZXQoTVBJX0NvbW0gY29tbSwgaW50ICpubm9kZXMsIGludCAqbmVkZ2VzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyZXF1ZXN0X2NvbXBsZXRlKE1QSV9SZXF1ZXN0IHJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JlcXVlc3Rfc3RhcnQoTVBJX0dyZXF1ZXN0X3F1ZXJ5X2Z1bmN0aW9uICpxdWVyeV9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9HcmVxdWVzdF9mcmVlX2Z1bmN0aW9uICpmcmVlX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyZXF1ZXN0X2NhbmNlbF9mdW5jdGlvbiAqY2FuY2VsX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFfc3RhdGUsIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IFBNUElfR3JvdXBfYzJmKE1QSV9Hcm91cCBncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9jb21wYXJlKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsIGludCAqcmVzdWx0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyb3VwX2RpZmZlcmVuY2UoTVBJX0dyb3VwIGdyb3VwMSwgTVBJX0dyb3VwIGdyb3VwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9leGNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCAqcmFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgTVBJX0dyb3VwIFBNUElfR3JvdXBfZjJjKE1QSV9GaW50IGdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyb3VwX2ZyZWUoTVBJX0dyb3VwICpncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9pbmNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCAqcmFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Hcm91cCAqbmV3Z3JvdXApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JvdXBfaW50ZXJzZWN0aW9uKE1QSV9Hcm91cCBncm91cDEsIE1QSV9Hcm91cCBncm91cDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9yYW5nZV9leGNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCByYW5nZXNbXVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9yYW5nZV9pbmNsKE1QSV9Hcm91cCBncm91cCwgaW50IG4sIGludCByYW5nZXNbXVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF9yYW5rKE1QSV9Hcm91cCBncm91cCwgaW50ICpyYW5rKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0dyb3VwX3NpemUoTVBJX0dyb3VwIGdyb3VwLCBpbnQgKnNpemUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfR3JvdXBfdHJhbnNsYXRlX3JhbmtzKE1QSV9Hcm91cCBncm91cDEsIGludCBuLCBpbnQgKnJhbmtzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfR3JvdXAgZ3JvdXAyLCBpbnQgKnJhbmtzMik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Hcm91cF91bmlvbihNUElfR3JvdXAgZ3JvdXAxLCBNUElfR3JvdXAgZ3JvdXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0dyb3VwICpuZXdncm91cCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JYnNlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSwgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9JbmZvX2MyZihNUElfSW5mbyBpbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fY3JlYXRlKE1QSV9JbmZvICppbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZGVsZXRlKE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JbmZvX2R1cChNUElfSW5mbyBpbmZvLCBNUElfSW5mbyAqbmV3aW5mbyk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfSW5mbyBQTVBJX0luZm9fZjJjKE1QSV9GaW50IGluZm8pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSW5mb19mcmVlKE1QSV9JbmZvICppbmZvKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZ2V0KE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSwgaW50IHZhbHVlbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsdWUsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JbmZvX2dldF9ua2V5cyhNUElfSW5mbyBpbmZvLCBpbnQgKm5rZXlzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZ2V0X250aGtleShNUElfSW5mbyBpbmZvLCBpbnQgbiwgY2hhciAqa2V5KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luZm9fZ2V0X3ZhbHVlbGVuKE1QSV9JbmZvIGluZm8sIGNoYXIgKmtleSwgaW50ICp2YWx1ZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9JbmZvX3NldChNUElfSW5mbyBpbmZvLCBjaGFyICprZXksIGNoYXIgKnZhbHVlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luaXQoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSW5pdGlhbGl6ZWQoaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0luaXRfdGhyZWFkKGludCAqYXJnYywgY2hhciAqKiphcmd2LCBpbnQgcmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnByb3ZpZGVkKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ludGVyY29tbV9jcmVhdGUoTVBJX0NvbW0gbG9jYWxfY29tbSwgaW50IGxvY2FsX2xlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gYnJpZGdlX2NvbW0sIGludCByZW1vdGVfbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSAqbmV3aW50ZXJjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0ludGVyY29tbV9tZXJnZShNUElfQ29tbSBpbnRlcmNvbW0sIGludCBoaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9Db21tICpuZXdpbnRlcmNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSXByb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfSXJlY3Yodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0lyc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Jc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX0lzc2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Jc190aHJlYWRfbWFpbihpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfS2V5dmFsX2NyZWF0ZShNUElfQ29weV9mdW5jdGlvbiAqY29weV9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RlbGV0ZV9mdW5jdGlvbiAqZGVsZXRlX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmtleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfS2V5dmFsX2ZyZWUoaW50ICprZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfTG9va3VwX25hbWUoY2hhciAqc2VydmljZV9uYW1lLCBNUElfSW5mbyBpbmZvLCBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9PcF9jMmYoTVBJX09wIG9wKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX09wX2NyZWF0ZShNUElfVXNlcl9mdW5jdGlvbiAqZnVuY3Rpb24sIGludCBjb21tdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9PcCAqb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfT3Blbl9wb3J0KE1QSV9JbmZvIGluZm8sIGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBNUElfT3AgUE1QSV9PcF9mMmMoTVBJX0ZpbnQgb3ApOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfT3BfZnJlZShNUElfT3AgKm9wKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1BhY2tfZXh0ZXJuYWwoY2hhciAqZGF0YXJlcCwgdm9pZCAqaW5idWYsIGludCBpbmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIHZvaWQgKm91dGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgb3V0c2l6ZSwgTVBJX0FpbnQgKnBvc2l0aW9uKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1BhY2tfZXh0ZXJuYWxfc2l6ZShjaGFyICpkYXRhcmVwLCBpbnQgaW5jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9BaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1BhY2sodm9pZCAqaW5idWYsIGludCBpbmNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dGJ1ZiwgaW50IG91dHNpemUsIGludCAqcG9zaXRpb24sIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfUGFja19zaXplKGludCBpbmNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1Bjb250cm9sKGNvbnN0IGludCBsZXZlbCwgLi4uKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1Byb2JlKGludCBzb3VyY2UsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9QdWJsaXNoX25hbWUoY2hhciAqc2VydmljZV9uYW1lLCBNUElfSW5mbyBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBvcnRfbmFtZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9QdXQodm9pZCAqb3JpZ2luX2FkZHIsIGludCBvcmlnaW5fY291bnQsIE1QSV9EYXRhdHlwZSBvcmlnaW5fZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF9yYW5rLCBNUElfQWludCB0YXJnZXRfZGlzcCwgaW50IHRhcmdldF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgdGFyZ2V0X2RhdGF0eXBlLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9RdWVyeV90aHJlYWQoaW50ICpwcm92aWRlZCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWN2X2luaXQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tLCBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWN2KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWcsIE1QSV9Db21tIGNvbW0sIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWR1Y2Uodm9pZCAqc2VuZGJ1Ziwgdm9pZCAqcmVjdmJ1ZiwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgTVBJX09wIG9wLCBpbnQgcm9vdCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWR1Y2Vfc2NhdHRlcih2b2lkICpzZW5kYnVmLCB2b2lkICpyZWN2YnVmLCBpbnQgKnJlY3Zjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9PcCBvcCwgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZWdpc3Rlcl9kYXRhcmVwKGNoYXIgKmRhdGFyZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhcmVwX2NvbnZlcnNpb25fZnVuY3Rpb24gKnJlYWRfY29udmVyc2lvbl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfY29udmVyc2lvbl9mdW5jdGlvbiAqd3JpdGVfY29udmVyc2lvbl9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGFyZXBfZXh0ZW50X2Z1bmN0aW9uICpkdHlwZV9maWxlX2V4dGVudF9mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9SZXF1ZXN0X2MyZihNUElfUmVxdWVzdCByZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIE1QSV9SZXF1ZXN0IFBNUElfUmVxdWVzdF9mMmMoTVBJX0ZpbnQgcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9SZXF1ZXN0X2ZyZWUoTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfUmVxdWVzdF9nZXRfc3RhdHVzKE1QSV9SZXF1ZXN0IHJlcXVlc3QsIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfUnNlbmQodm9pZCAqaWJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsIGludCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9Sc2VuZF9pbml0KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0LCBpbnQgdGFnLCBNUElfQ29tbSBjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfUmVxdWVzdCAqcmVxdWVzdCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TY2FuKHZvaWQgKnNlbmRidWYsIHZvaWQgKnJlY3ZidWYsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBNUElfT3Agb3AsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2NhdHRlcih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvb3QsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2NhdHRlcnYodm9pZCAqc2VuZGJ1ZiwgaW50ICpzZW5kY291bnRzLCBpbnQgKmRpc3BscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBzZW5kdHlwZSwgdm9pZCAqcmVjdmJ1ZiwgaW50IHJlY3Zjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSByZWN2dHlwZSwgaW50IHJvb3QsIE1QSV9Db21tIGNvbW0pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2VuZF9pbml0KHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3QsIGludCB0YWcsIE1QSV9Db21tIGNvbW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU2VuZCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLCBpbnQgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TZW5kcmVjdih2b2lkICpzZW5kYnVmLCBpbnQgc2VuZGNvdW50LCBNUElfRGF0YXR5cGUgc2VuZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHNlbmR0YWcsIHZvaWQgKnJlY3ZidWYsIGludCByZWN2Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgcmVjdnR5cGUsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSwgIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TZW5kcmVjdl9yZXBsYWNlKHZvaWQgKiBidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHNlbmR0YWcsIGludCBzb3VyY2UsIGludCByZWN2dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQ29tbSBjb21tLCBNUElfU3RhdHVzICpzdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU3NlbmRfaW5pdCh2b2lkICpidWYsIGludCBjb3VudCwgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdCwgaW50IHRhZywgTVBJX0NvbW0gY29tbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1JlcXVlc3QgKnJlcXVlc3QpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU3NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSwgaW50IGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBNUElfQ29tbSBjb21tKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1N0YXJ0KE1QSV9SZXF1ZXN0ICpyZXF1ZXN0KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1N0YXJ0YWxsKGludCBjb3VudCwgTVBJX1JlcXVlc3QgKmFycmF5X29mX3JlcXVlc3RzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1N0YXR1c19jMmYoTVBJX1N0YXR1cyAqY19zdGF0dXMsIE1QSV9GaW50ICpmX3N0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TdGF0dXNfZjJjKE1QSV9GaW50ICpmX3N0YXR1cywgTVBJX1N0YXR1cyAqY19zdGF0dXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfU3RhdHVzX3NldF9jYW5jZWxsZWQoTVBJX1N0YXR1cyAqc3RhdHVzLCBpbnQgZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9TdGF0dXNfc2V0X2VsZW1lbnRzKE1QSV9TdGF0dXMgKnN0YXR1cywgTVBJX0RhdGF0eXBlIGRhdGF0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVGVzdGFsbChpbnQgY291bnQsIE1QSV9SZXF1ZXN0IGFycmF5X29mX3JlcXVlc3RzW10sIGludCAqZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyBhcnJheV9vZl9zdGF0dXNlc1tdKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1Rlc3RhbnkoaW50IGNvdW50LCBNUElfUmVxdWVzdCBhcnJheV9vZl9yZXF1ZXN0c1tdLCBpbnQgKmluZGV4LCBpbnQgKmZsYWcsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UZXN0KE1QSV9SZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgKmZsYWcsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UZXN0X2NhbmNlbGxlZChNUElfU3RhdHVzICpzdGF0dXMsIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UZXN0c29tZShpbnQgaW5jb3VudCwgTVBJX1JlcXVlc3QgYXJyYXlfb2ZfcmVxdWVzdHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0Y291bnQsIGludCBhcnJheV9vZl9pbmRpY2VzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfU3RhdHVzIGFycmF5X29mX3N0YXR1c2VzW10pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVG9wb190ZXN0KE1QSV9Db21tIGNvbW0sIGludCAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIE1QSV9GaW50IFBNUElfVHlwZV9jMmYoTVBJX0RhdGF0eXBlIGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfY29tbWl0KE1QSV9EYXRhdHlwZSAqdHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2NvbnRpZ3VvdXMoaW50IGNvdW50LCBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfZGFycmF5KGludCBzaXplLCBpbnQgcmFuaywgaW50IG5kaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnc2l6ZV9hcnJheVtdLCBpbnQgZGlzdHJpYl9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXJnX2FycmF5W10sIGludCBwc2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfY3JlYXRlX2Y5MF9jb21wbGV4KGludCBwLCBpbnQgciwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfY3JlYXRlX2Y5MF9pbnRlZ2VyKGludCByLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfZjkwX3JlYWwoaW50IHAsIGludCByLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCBhcnJheV9vZl9kaXNwbGFjZW1lbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2NyZWF0ZV9odmVjdG9yKGludCBjb3VudCwgaW50IGJsb2NrbGVuZ3RoLCBNUElfQWludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfa2V5dmFsKE1QSV9UeXBlX2NvcHlfYXR0cl9mdW5jdGlvbiAqdHlwZV9jb3B5X2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1R5cGVfZGVsZXRlX2F0dHJfZnVuY3Rpb24gKnR5cGVfZGVsZXRlX2F0dHJfZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlX2tleXZhbCwgdm9pZCAqZXh0cmFfc3RhdGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfaW5kZXhlZF9ibG9jayhpbnQgY291bnQsIGludCBibG9ja2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2NyZWF0ZV9zdHJ1Y3QoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tfbGVuZ3Roc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgYXJyYXlfb2ZfdHlwZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfc3ViYXJyYXkoaW50IG5kaW1zLCBpbnQgc2l6ZV9hcnJheVtdLCBpbnQgc3Vic2l6ZV9hcnJheVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2FycmF5W10sIGludCBvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9jcmVhdGVfcmVzaXplZChNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0FpbnQgbGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGV4dGVudCwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZGVsZXRlX2F0dHIoTVBJX0RhdGF0eXBlIHR5cGUsIGludCB0eXBlX2tleXZhbCk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2R1cChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZXh0ZW50KE1QSV9EYXRhdHlwZSB0eXBlLCBNUElfQWludCAqZXh0ZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZnJlZShNUElfRGF0YXR5cGUgKnR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9mcmVlX2tleXZhbChpbnQgKnR5cGVfa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIE1QSV9EYXRhdHlwZSBQTVBJX1R5cGVfZjJjKE1QSV9GaW50IGRhdGF0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZ2V0X2F0dHIoTVBJX0RhdGF0eXBlIHR5cGUsIGludCB0eXBlX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cmlidXRlX3ZhbCwgaW50ICpmbGFnKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZ2V0X2NvbnRlbnRzKE1QSV9EYXRhdHlwZSBtdHlwZSwgaW50IG1heF9pbnRlZ2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYWRkcmVzc2VzLCBpbnQgbWF4X2RhdGF0eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheV9vZl9pbnRlZ2Vyc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfYWRkcmVzc2VzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgYXJyYXlfb2ZfZGF0YXR5cGVzW10pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9nZXRfZW52ZWxvcGUoTVBJX0RhdGF0eXBlIHR5cGUsIGludCAqbnVtX2ludGVnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fYWRkcmVzc2VzLCBpbnQgKm51bV9kYXRhdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbWJpbmVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfZ2V0X2V4dGVudChNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0FpbnQgKmxiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50ICpleHRlbnQpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9nZXRfbmFtZShNUElfRGF0YXR5cGUgdHlwZSwgY2hhciAqdHlwZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlc3VsdGxlbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2dldF90cnVlX2V4dGVudChNUElfRGF0YXR5cGUgZGF0YXR5cGUsIE1QSV9BaW50ICp0cnVlX2xiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgKnRydWVfZXh0ZW50KTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfaGluZGV4ZWQoaW50IGNvdW50LCBpbnQgYXJyYXlfb2ZfYmxvY2tsZW5ndGhzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9BaW50IGFycmF5X29mX2Rpc3BsYWNlbWVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIG9sZHR5cGUsIE1QSV9EYXRhdHlwZSAqbmV3dHlwZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX2h2ZWN0b3IoaW50IGNvdW50LCBpbnQgYmxvY2tsZW5ndGgsIE1QSV9BaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgb2xkdHlwZSwgTVBJX0RhdGF0eXBlICpuZXd0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfaW5kZXhlZChpbnQgY291bnQsIGludCBhcnJheV9vZl9ibG9ja2xlbmd0aHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9sYihNUElfRGF0YXR5cGUgdHlwZSwgTVBJX0FpbnQgKmxiKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfbWF0Y2hfc2l6ZShpbnQgdHlwZWNsYXNzLCBpbnQgc2l6ZSwgTVBJX0RhdGF0eXBlICp0eXBlKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfc2V0X2F0dHIoTVBJX0RhdGF0eXBlIHR5cGUsIGludCB0eXBlX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXR0cl92YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV9zZXRfbmFtZShNUElfRGF0YXR5cGUgdHlwZSwgY2hhciAqdHlwZV9uYW1lKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfc2l6ZShNUElfRGF0YXR5cGUgdHlwZSwgaW50ICpzaXplKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1R5cGVfc3RydWN0KGludCBjb3VudCwgaW50IGFycmF5X29mX2Jsb2NrbGVuZ3Roc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0FpbnQgYXJyYXlfb2ZfZGlzcGxhY2VtZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0RhdGF0eXBlIGFycmF5X29mX3R5cGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVHlwZV91YihNUElfRGF0YXR5cGUgbXR5cGUsIE1QSV9BaW50ICp1Yik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9UeXBlX3ZlY3RvcihpbnQgY291bnQsIGludCBibG9ja2xlbmd0aCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9EYXRhdHlwZSBvbGR0eXBlLCBNUElfRGF0YXR5cGUgKm5ld3R5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVW5wYWNrKHZvaWQgKmluYnVmLCBpbnQgaW5zaXplLCBpbnQgKnBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm91dGJ1ZiwgaW50IG91dGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0NvbW0gY29tbSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9VbnB1Ymxpc2hfbmFtZShjaGFyICpzZXJ2aWNlX25hbWUsIE1QSV9JbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwb3J0X25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfVW5wYWNrX2V4dGVybmFsIChjaGFyICpkYXRhcmVwLCB2b2lkICppbmJ1ZiwgTVBJX0FpbnQgaW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfQWludCAqcG9zaXRpb24sIHZvaWQgKm91dGJ1ZiwgaW50IG91dGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfRGF0YXR5cGUgZGF0YXR5cGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2FpdGFsbChpbnQgY291bnQsIE1QSV9SZXF1ZXN0ICphcnJheV9vZl9yZXF1ZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2FpdGFueShpbnQgY291bnQsIE1QSV9SZXF1ZXN0ICphcnJheV9vZl9yZXF1ZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwgTVBJX1N0YXR1cyAqc3RhdHVzKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dhaXQoTVBJX1JlcXVlc3QgKnJlcXVlc3QsIE1QSV9TdGF0dXMgKnN0YXR1cyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XYWl0c29tZShpbnQgaW5jb3VudCwgTVBJX1JlcXVlc3QgKmFycmF5X29mX3JlcXVlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRjb3VudCwgaW50ICphcnJheV9vZl9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1N0YXR1cyAqYXJyYXlfb2Zfc3RhdHVzZXMpOwotT01QSV9ERUNMU1BFQyAgTVBJX0ZpbnQgUE1QSV9XaW5fYzJmKE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jYWxsX2VycmhhbmRsZXIoTVBJX1dpbiB3aW4sIGludCBlcnJvcmNvZGUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2NvbXBsZXRlKE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jcmVhdGUodm9pZCAqYmFzZSwgTVBJX0FpbnQgc2l6ZSwgaW50IGRpc3BfdW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX0luZm8gaW5mbywgTVBJX0NvbW0gY29tbSwgTVBJX1dpbiAqd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jcmVhdGVfZXJyaGFuZGxlcihNUElfV2luX2VycmhhbmRsZXJfZm4gKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9FcnJoYW5kbGVyICplcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9jcmVhdGVfa2V5dmFsKE1QSV9XaW5fY29weV9hdHRyX2Z1bmN0aW9uICp3aW5fY29weV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBJX1dpbl9kZWxldGVfYXR0cl9mdW5jdGlvbiAqd2luX2RlbGV0ZV9hdHRyX2ZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aW5fa2V5dmFsLCB2b2lkICpleHRyYV9zdGF0ZSk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fZGVsZXRlX2F0dHIoTVBJX1dpbiB3aW4sIGludCB3aW5fa2V5dmFsKTsKLU9NUElfREVDTFNQRUMgIE1QSV9XaW4gUE1QSV9XaW5fZjJjKE1QSV9GaW50IHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fZmVuY2UoaW50IGFzc2VydCwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2ZyZWUoTVBJX1dpbiAqd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9mcmVlX2tleXZhbChpbnQgKndpbl9rZXl2YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2dldF9hdHRyKE1QSV9XaW4gd2luLCBpbnQgd2luX2tleXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphdHRyaWJ1dGVfdmFsLCBpbnQgKmZsYWcpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX2dldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciAqZXJyaGFuZGxlcik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fZ2V0X2dyb3VwKE1QSV9XaW4gd2luLCBNUElfR3JvdXAgKmdyb3VwKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9nZXRfbmFtZShNUElfV2luIHdpbiwgY2hhciAqd2luX25hbWUsIGludCAqcmVzdWx0bGVuKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9sb2NrKGludCBsb2NrX3R5cGUsIGludCByYW5rLCBpbnQgYXNzZXJ0LCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fcG9zdChNUElfR3JvdXAgZ3JvdXAsIGludCBhc3NlcnQsIE1QSV9XaW4gd2luKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9zZXRfYXR0cihNUElfV2luIHdpbiwgaW50IHdpbl9rZXl2YWwsIHZvaWQgKmF0dHJpYnV0ZV92YWwpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX3NldF9lcnJoYW5kbGVyKE1QSV9XaW4gd2luLCBNUElfRXJyaGFuZGxlciBlcnJoYW5kbGVyKTsKLU9NUElfREVDTFNQRUMgIGludCBQTVBJX1dpbl9zZXRfbmFtZShNUElfV2luIHdpbiwgY2hhciAqd2luX25hbWUpOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX3N0YXJ0KE1QSV9Hcm91cCBncm91cCwgaW50IGFzc2VydCwgTVBJX1dpbiB3aW4pOwotT01QSV9ERUNMU1BFQyAgaW50IFBNUElfV2luX3Rlc3QoTVBJX1dpbiB3aW4sIGludCAqZmxhZyk7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fdW5sb2NrKGludCByYW5rLCBNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBpbnQgUE1QSV9XaW5fd2FpdChNUElfV2luIHdpbik7Ci1PTVBJX0RFQ0xTUEVDICBkb3VibGUgUE1QSV9XdGljayh2b2lkKTsKLU9NUElfREVDTFNQRUMgIGRvdWJsZSBQTVBJX1d0aW1lKHZvaWQpOwotCi0jaWYgZGVmaW5lZChjX3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotfQotI2VuZGlmCi0KLS8qCi0gKiBDb25kaXRpb25hbCBNUEkgMiBDKysgYmluZGluZ3Mgc3VwcG9ydC4gIEluY2x1ZGUgaWY6Ci0gKiAgIC0gVGhlIHVzZXIgZG9lcyBub3QgZXhwbGljaXRseSByZXF1ZXN0IHVzIHRvIHNraXAgaXQgKHdoZW4gYSBDKysgY29tcGlsZXIKLSAqICAgICAgIGlzIHVzZWQgdG8gY29tcGlsZSBDIGNvZGUpLgotICogICAtIFdlIHdhbnQgQysrIGJpbmRpbmdzIHN1cHBvcnQKLSAqICAgLSBXZSBhcmUgbm90IGJ1aWxkaW5nIE9NUEkgaXRzZWxmCi0gKiAgIC0gV2UgYXJlIHVzaW5nIGEgQysrIGNvbXBpbGVyCi0gKi8KLSNpZiAhZGVmaW5lZChPTVBJX1NLSVBfTVBJQ1hYKSAmJiBPTVBJX1dBTlRfQ1hYX0JJTkRJTkdTICYmICFPTVBJX0JVSUxESU5HCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotI2luY2x1ZGUgIm9wZW5tcGkvb21waS9tcGkvY3h4L21waWN4eC5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIE9NUElfTVBJX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvcmVzb3VyY2VzL3Rlc3RNUEkuYyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvcmVzb3VyY2VzL3Rlc3RNUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhMTZjZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL3Jlc291cmNlcy90ZXN0TVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJtcGkuaCIKLS8vIFNhbXBsZSBNUEkgcHJvZ3JhbQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0JcHJpbnRmKCJIZWxsbyBNUEkgUFRQIFdvcmxkIVxuIik7CQotCWludCAgbXlfcmFuazsgLyogcmFuayBvZiBwcm9jZXNzICovCi0JaW50ICBwOyAgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc2VzICovCi0JaW50IHNvdXJjZTsgICAvKiByYW5rIG9mIHNlbmRlciAqLwotCWludCBkZXN0OyAgICAgLyogcmFuayBvZiByZWNlaXZlciAqLwotCWludCB0YWc9MDsgICAgLyogdGFnIGZvciBtZXNzYWdlcyAqLwotCWNoYXIgbWVzc2FnZVsxMDBdOyAgICAgICAgLyogc3RvcmFnZSBmb3IgbWVzc2FnZSAqLwotCU1QSV9TdGF0dXMgc3RhdHVzIDsgICAvKiByZXR1cm4gc3RhdHVzIGZvciByZWNlaXZlICovCi0JCi0JLyogc3RhcnQgdXAgTVBJICovCi0JCi0JTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKLQkKLQkvKiBmaW5kIG91dCBwcm9jZXNzIHJhbmsgKi8KLQlNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmbXlfcmFuayk7IAotCQotCS8qIGZpbmQgb3V0IG51bWJlciBvZiBwcm9jZXNzZXMgKi8KLQlNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmcCk7IAotCQotCQotCWlmIChteV9yYW5rICE9MCl7Ci0JCS8qIGNyZWF0ZSBtZXNzYWdlICovCi0JCXNwcmludGYobWVzc2FnZSwgIkdyZWV0aW5ncyBmcm9tIHByb2Nlc3MgJWQhIiwgbXlfcmFuayk7Ci0JCWRlc3QgPSAwOwotCQkvKiB1c2Ugc3RybGVuKzEgc28gdGhhdCAnXDAnIGdldCB0cmFuc21pdHRlZCAqLwotCQlNUElfU2VuZChtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkrMSwgTVBJX0NIQVIsCi0JCSAgIGRlc3QsIHRhZywgTVBJX0NPTU1fV09STEQpOwotCX0KLQllbHNlewotCQlwcmludGYoIkZyb20gcHJvY2VzcyAwOiBOdW0gcHJvY2Vzc2VzOiAlZFxuIixwKTsKLQkJZm9yIChzb3VyY2UgPSAxOyBzb3VyY2UgPCBwOyBzb3VyY2UrKykgewotCQkJTVBJX1JlY3YobWVzc2FnZSwgMTAwLCBNUElfQ0hBUiwgc291cmNlLCB0YWcsCi0JCQkgICAgICBNUElfQ09NTV9XT1JMRCwgJnN0YXR1cyk7Ci0JCQlwcmludGYoIiVzXG4iLG1lc3NhZ2UpOwotCQl9Ci0JfQotCS8qIHNodXQgZG93biBNUEkgKi8KLQlNUElfRmluYWxpemUoKTsgCi0JCi0JCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC90ZXN0cy9QbGR0QmFzZVRlc3RGcmFtZXdvcmsuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3Rlc3RzL1BsZHRCYXNlVGVzdEZyYW1ld29yay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGFkNGJlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3Rlc3RzL1BsZHRCYXNlVGVzdEZyYW1ld29yay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS50ZXN0cy5CYXNlVGVzdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGJldGgKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGxkdEJhc2VUZXN0RnJhbWV3b3JrIGV4dGVuZHMgQmFzZVRlc3RGcmFtZXdvcmsgewotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SW50ZWdlcj4+IGxpbmVNYXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SW50ZWdlcj4+KCk7Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGZpbGUgaW50byB0aGUgdGVzdCBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElGaWxlIGltcG9ydEZpbGUoU3RyaW5nIHNyY0RpciwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShmaWxlbmFtZSkuZGVsZXRlKHRydWUsIG5ldwotCQkvLyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlJRmlsZSByZXN1bHQgPSBzdXBlci5pbXBvcnRGaWxlKGZpbGVuYW1lLCByZWFkVGVzdEZpbGUoc3JjRGlyLCBmaWxlbmFtZSkpOwotCQkvLyBwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldwotCQkvLyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVhZFRlc3RGaWxlKFN0cmluZyBzcmNEaXIsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SW50ZWdlcj4gbGluZU1hcCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oNTApOwotCQlsaW5lTWFwcy5wdXQoZmlsZW5hbWUsIGxpbmVNYXApOwotCQlsaW5lTWFwLmFkZCgwKTsgLy8gT2Zmc2V0IG9mIGxpbmUgMQotCQlyZXR1cm4gcmVhZFN0cmVhbShsaW5lTWFwLCBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi8iICsgc3JjRGlyICsgIi8iICsgZmlsZW5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWRTdHJlYW0oQXJyYXlMaXN0PEludGVnZXI+IGxpbmVNYXAsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDQwOTYpOwotCQlCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLQkJZm9yIChpbnQgb2Zmc2V0ID0gMCwgY2ggPSBpbi5yZWFkKCk7IGNoID49IDA7IGNoID0gaW4ucmVhZCgpKSB7Ci0JCQlzYi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJCW9mZnNldCsrOwotCi0JCQlpZiAoY2ggPT0gJ1xuJyAmJiBsaW5lTWFwICE9IG51bGwpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmUgIiArIChsaW5lTWFwLnNpemUoKSsxKSArCi0JCQkJLy8gIiBzdGFydHMgYXQgb2Zmc2V0ICIgKyBvZmZzZXQpOwotCQkJCWxpbmVNYXAuYWRkKG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJaW4uY2xvc2UoKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcmVhZFN0cmVhbShudWxsLCBpbnB1dFN0cmVhbSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkV29ya3NwYWNlRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiByZWFkU3RyZWFtKHByb2plY3QuZ2V0RmlsZShmaWxlbmFtZSkuZ2V0Q29udGVudHMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIGxpbmUgbnVtYmVyLCBzdGFydGluZyBhdCAxCi0JICogQHBhcmFtIGNvbAotCSAqICAgICAgICAgICAgY29sdW1uIG51bWJlciwgc3RhcnRpbmcgYXQgMQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGluZUNvbE9mZnNldChTdHJpbmcgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sKSB7Ci0JCXJldHVybiBsaW5lTWFwcy5nZXQoZmlsZW5hbWUpLmdldChsaW5lIC0gMSkgKyAoY29sIC0gMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdGVzdHMvVGVzdC5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdGVzdHMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODZjYWNiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3Rlc3RzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5jb3JlLk1waUlEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuY29yZS5hY3Rpb25zLlJ1bkFuYWx5c2VNUEljb21tYW5kSGFuZGxlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgYmV0aAotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBQbGR0QmFzZVRlc3RGcmFtZXdvcmt7Ci0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RNUElhcnRpZmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGltcG9ydEZpbGUoInJlc291cmNlcyIsICJ0ZXN0TVBJLmMiKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJCi0JCUlGaWxlIG1waUluY2x1ZGUgPSBpbXBvcnRGaWxlKCJyZXNvdXJjZXMvaW5jbHVkZXMiLCJtcGkuaCIpOwotCQlhc3NlcnROb3ROdWxsKG1waUluY2x1ZGUpOwotCQlTdHJpbmcgdGVtcFBhdGggPSBtcGlJbmNsdWRlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpOy8vaW5jbHVkZVBhdGg9IC9SZWdyZXNzaW9uVGVzdFByb2plY3QvbXBpLmgKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZW1wUGF0aD0iK3RlbXBQYXRoKTsKLQkJU3RyaW5nIGluY2x1ZGVQYXRoID0gbXBpSW5jbHVkZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UmF3TG9jYXRpb24oKS50b09TU3RyaW5nKCkKLQkJCSsgbXBpSW5jbHVkZS5nZXRGdWxsUGF0aCgpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImluY2x1ZGVQYXRoPSAiK2luY2x1ZGVQYXRoKTsKLQotCQlhc3NlcnRUcnVlKGZpbGUgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKTsKLQotCQkvLyBJQ0VsZW1lbnQgY292ZXJzIGZvbGRlcnMgYW5kIHRyYW5zbGF0aW9udW5pdHMKLQkJZmluYWwgSUNFbGVtZW50IGNlID0gKElDRWxlbWVudCkgKChJQWRhcHRhYmxlKSBmaWxlKS5nZXRBZGFwdGVyKElDRWxlbWVudC5jbGFzcyk7Ci0JCS8vIGFzc2VydE5vdE51bGwoY2UpOwotCQlMaXN0PFN0cmluZz4gaW5jbHVkZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7aW5jbHVkZVBhdGh9KTsKLQkJUnVuQW5hbHlzZU1QSWNvbW1hbmRIYW5kbGVyIHJhY20gPSBuZXcgUnVuQW5hbHlzZU1QSWNvbW1hbmRIYW5kbGVyKCk7Ci0JCQotCQlyYWNtLnJ1blJlc291cmNlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGNlLCAwLCBpbmNsdWRlcyk7Ci0JCQotCQlJTWFya2VyW10gbWFya2Vycz1maWxlLmZpbmRNYXJrZXJzKE1waUlEcy5NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCWFzc2VydE5vdE51bGwobWFya2Vycyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibnVtTWFya2VyczogIittYXJrZXJzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGkrICIgbWFya2VyOiAiK21hcmtlci50b1N0cmluZygpKTsKLQkJCQotCQkJCi0JCX0KLQkJCi0JCQotLy8JCXByb3RlY3RlZCBib29sZWFuIHJ1blJlc291cmNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUNFbGVtZW50IGNlLAotLy8JCQkJaW50IGluZGVudCwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLy5jbGFzc3BhdGggYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY3ZzaWdub3JlIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOGRkMS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWljb25zLW9sZApkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvLnByb2plY3QgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0OTM2Ny4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZhZTNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNkdC51aSwKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24sCi0gb3JnLmVjbGlwc2UuaGVscCwKLSBvcmcuZWNsaXBzZS5jZHQuZG9jLnVzZXIsCi0gb3JnLmVjbGlwc2UuY2R0LmNvcmUucGFyc2VyLnVwYztidW5kbGUtdmVyc2lvbj0iNS4wLjAiCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzJjNjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGh0bWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX01ZVEhSRUFELmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX01ZVEhSRUFELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzIyMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC9pZF9NWVRIUkVBRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPGgyPjxjb2RlPk1ZVEhSRUFEPC9jb2RlPiBrZXl3b3JkPC9oMj4KLQotCi08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT5NWVRIUkVBRDwvY29kZT4gIGlzIGFuIGV4cHJlc3Npb24gd2l0aCBhIHZhbHVlIG9mIHR5cGUgaW50OyBpdCBzcGVjaWZpZXMgdGhlIHVuaXF1ZQotdGhyZWFkIGluZGV4LiAKLTxicj5UaGUgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzIGlzIDxjb2RlPjAuLlRIUkVBRFMtMTY8L2NvZGU+LgotPGg0PkV4YW1wbGU8L2g0PgotPHA+VGhlIGZvbGxvd2luZyBwcm9ncmFtIHByaW50cyB0aGUgbnVtYmVycyAwCi10aHJvdWdoIDxjb2RlPlRIUkVBRFMtMTwvY29kZT4sIGluIHNvbWUgb3JkZXIuCi08cHJlPgotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBtYWluKCl7IAotICAgICAgcHJpbnRmKCIlZCAiLE1ZVEhSRUFEKTsgCi0gICAgfQotPC9wcmU+Ci08cD5TZWUgYWxzbyA8YSBocmVmPSJpZF9USFJFQURTLmh0bWwiPjxjb2RlPlRIUkVBRFM8L2NvZGU+PC9hPiwKLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX1RIUkVBRFMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVEhSRUFEUy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAwMzgzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVEhSRUFEUy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPGgyPjxjb2RlPjxjb2RlPlRIUkVBRFM8L2NvZGU+PC9jb2RlPiBrZXl3b3JkPC9oMj4KLQotCi08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT5USFJFQURTPC9jb2RlPiBpcyBhbiBleHByZXNzaW9uIHdpdGggYSB2YWx1ZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT47IGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCi10aHJlYWRzIGFuZCBoYXMgdGhlIHNhbWUgdmFsdWUgb24gZXZlcnkgdGhyZWFkLiBVbmRlciB0aGUgc3RhdGljIDxjb2RlPlRIUkVBRFM8L2NvZGU+Ci10cmFuc2xhdGlvbiBlbnZpcm9ubWVudCwgPGNvZGU+VEhSRUFEUzwvY29kZT4gaXMgYW4gPGNvZGU+aW50PC9jb2RlPmVnZXIgY29uc3RhbnQgc3VpdGFibGUgZm9yIHVzZSBpbgotI2lmIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcy4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVVBDX01BWF9CTE9DS19TSVpFLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2lkX1VQQ19NQVhfQkxPQ0tfU0laRS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTFmNTljLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaWRfVVBDX01BWF9CTE9DS19TSVpFLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08aDI+PGNvZGU+VVBDX01BWF9CTE9DS19TSVpFPC9jb2RlPiBpZGVudGlmaWVyPC9oMj4KLQotCi08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT5VUENfTUFYX0JMT0NLX1NJWkU8L2NvZGU+ICBpcyBhIHByZWRlZmluZWQgaW50ZWdlciBjb25zdGFudCB2YWx1ZS4gSXQgaW5kaWNhdGVzIHRoZQotbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGluIGEgbGF5b3V0IHF1YWxpZmllciBmb3Igc2hhcmVkIGRhdGEuIEl0IHNoYWxsIGJlCi1zdWl0YWJsZSBmb3IgdXNlIGluIDxjb2RlPiNpZjwvY29kZT4gcHJlcHJvY2Vzc2luZyBkaXJlY3RpdmVzLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaW5kZXguaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiYjQ3Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08aDIgaWQ9InRvcCI+VVBDIFN0YXRlbWVudHM8L2gyPgotPHVsPgotPGxpPjxhIGhyZWY9ImtleXdvcmRzLmh0bWwiPktleXdvcmRzL0lkZW50aWZpZXJzPC9hPgotPGxpPjxhIGhyZWY9ImtleXdvcmRzLmh0bWwiPktleXdvcmRzPC9hPgotCi08L3VsPgotPGgyIGlkPSJ0b3AiPlVQQyBmdW5jdGlvbnM8L2gyPgotPHA+VGVybWluYXRpb24gb2YgYWxsIHRocmVhZHMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfZ2xvYmFsX2V4aXQuaHRtbCI+IDxjb2RlPnVwY19nbG9iYWxfZXhpdDwvY29kZT4gPC9hPgotPC91bD4KLTxwPlNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfZ2xvYmFsX2FsbG9jLmh0bWwiPiA8Y29kZT51cGNfZ2xvYmFsX2FsbG9jPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2FsbF9hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2FsbF9hbGxvYzwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2FsbG9jPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2xvY2FsX2FsbG9jLmh0bWwiPiA8Y29kZT51cGNfbG9jYWxfYWxsb2M8L2NvZGU+IDwvYT4gIDxpPmRlcHJlY2F0ZWQ8L2k+Ci08bGk+PGEgaHJlZj0idXBjX2ZyZWUuaHRtbCI+IDxjb2RlPnVwY19mcmVlPC9jb2RlPiA8L2E+Ci08L3VsPgotCi08cD5Qb2ludGVyLXRvLXNoYXJlZCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zCi08dWw+Ci08bGk+PGEgaHJlZj0idXBjX3RocmVhZG9mLmh0bWwiPiA8Y29kZT51cGNfdGhyZWFkb2Y8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfcGhhc2VvZi5odG1sIj4gPGNvZGU+dXBjX3BoYXNlb2Y8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfcmVzZXRwaGFzZS5odG1sIj4gPGNvZGU+dXBjX3Jlc2V0cGhhc2U8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfYWRkcmZpZWxkLmh0bWwiPiA8Y29kZT51cGNfYWRkcmZpZWxkPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2FmZmluaXR5c2l6ZS5odG1sIj4gPGNvZGU+dXBjX2FmZmluaXR5c2l6ZTwvY29kZT4gPC9hPgotPC91bD4KLQotPHA+TG9jayBmdW5jdGlvbnMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfbG9ja190Lmh0bWwiPiA8Y29kZT51cGNfbG9ja190PC9jb2RlPiA8L2E+ICZuYnNwOyB0eXBlIAotPGxpPjxhIGhyZWY9InVwY19nbG9iYWxfbG9ja19hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2dsb2JhbF9sb2NrX2FsbG9jPC9jb2RlPiAgPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfbG9ja19hbGxvYy5odG1sIj4gPGNvZGU+dXBjX2FsbF9sb2NrX2FsbG9jPC9jb2RlPiAgPC9hPgotPGxpPjxhIGhyZWY9InVwY19sb2NrX2ZyZWUuaHRtbCI+IDxjb2RlPnVwY19sb2NrX2ZyZWU8L2NvZGU+ICA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2xvY2suaHRtbCI+IDxjb2RlPnVwY19sb2NrPC9jb2RlPiAgPC9hPgotPGxpPjxhIGhyZWY9InVwY19sb2NrX2F0dGVtcHQuaHRtbCI+IDxjb2RlPnVwY19sb2NrX2F0dGVtcHQ8L2NvZGU+ICA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX3VubG9jay5odG1sIj4gPGNvZGU+dXBjX3VubG9jazwvY29kZT4gIDwvYT4KLTwvdWw+Ci0KLTxwPlNoYXJlZCBzdHJpbmcgaGFuZGxpbmcgZnVuY3Rpb25zCi08dWw+Ci08bGk+PGEgaHJlZj0idXBjX21lbWNweS5odG1sIj4gPGNvZGU+dXBjX21lbWNweTwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19tZW1nZXQuaHRtbCI+IDxjb2RlPnVwY19tZW1nZXQ8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfbWVtY3B5Lmh0bWwiPiA8Y29kZT51cGNfbWVtY3B5PC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX21lbXNldC5odG1sIj4gPGNvZGU+dXBjX21lbXNldDwvY29kZT4gPC9hPgotPC91bD4KLQotPHA+Q29sbGVjdGl2ZSBVdGlsaXRpZXMKLTx1bD4KLTxsaT48YSBocmVmPSJ1cGNfYWxsX2Jyb2FkY2FzdC5odG1sIj4gPGNvZGU+dXBjX2FsbF9icm9hZGNhc3Q8L2NvZGU+IDwvYT4KLTxsaT48YSBocmVmPSJ1cGNfYWxsX3NjYXR0ZXIuaHRtbCI+IDxjb2RlPnVwY19hbGxfc2NhdHRlcjwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfZ2F0aGVyLmh0bWwiPiA8Y29kZT51cGNfYWxsX2dhdGhlcjwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfZ2F0aGVyX2FsbC5odG1sIj4gPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsPC9jb2RlPiA8L2E+Ci08bGk+PGEgaHJlZj0idXBjX2FsbF9leGNoYW5nZS5odG1sIj4gPGNvZGU+dXBjX2FsbF9leGNoYW5nZTwvY29kZT4gPC9hPgotPGxpPjxhIGhyZWY9InVwY19hbGxfcGVybXV0ZS5odG1sIj4gPGNvZGU+dXBjX2FsbF9wZXJtdXRlPC9jb2RlPiA8L2E+Ci0KLTwvdWw+Ci08cD4KLVNlZSBhbHNvIDxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+Ci08cD4KLTxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwva2V5d29yZHMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwva2V5d29yZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMWFjMy4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL2tleXdvcmRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08aDI+VVBDIEtleXdvcmRzL0lkZW50aWZpZXJzPC9oMj4KLTxjb2RlPgotPHVsPiAgICAKLTxsaT48YSBocmVmPSJpZF9NWVRIUkVBRC5odG1sIj5NWVRIUkVBRCAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9yZWxheGVkLmh0bWwiPnJlbGF4ZWQgICAgICAgPC9hPgotPGxpPjxhIGhyZWY9ImlkX3NoYXJlZC5odG1sIj5zaGFyZWQgICAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9zdHJpY3QuaHRtbCI+c3RyaWN0ICAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9USFJFQURTLmh0bWwiPlRIUkVBRFMgICAgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2JhcnJpZXIuaHRtbCI+dXBjX2JhcnJpZXIgICAgICAgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2Jsb2Nrc2l6ZW9mLmh0bWwiPnVwY19ibG9ja3NpemVvZiAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF91cGNfZWxlbXNpemVvZi5odG1sIj51cGNfZWxlbXNpemVvZiAgICAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF91cGNfZmVuY2UuaHRtbCI+dXBjX2ZlbmNlICAgICAgICAgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2xvY2Fsc2l6ZW9mLmh0bWwiPnVwY19sb2NhbHNpemVvZiAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF9VUENfTUFYX0JMT0NLU0laRS5odG1sIj5VUENfTUFYX0JMT0NLU0laRSAgIDwvYT4KLTxsaT48YSBocmVmPSJpZF91cGNfbm90aWZ5Lmh0bWwiPnVwY19ub3RpZnkgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX3dhaXQuaHRtbCI+dXBjX3dhaXQgICA8L2E+Ci08bGk+PGEgaHJlZj0iaWRfdXBjX2ZvcmFsbC5odG1sIj51cGNfZm9yYWxsICAgICAgICA8L2E+ICAgICAKLTwvdWw+Ci08L2NvZGU+Ci0KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3NoYXJlZC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC9zaGFyZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZTM4ZC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3NoYXJlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPGgyPjxjb2RlPjxjb2RlPnNoYXJlZDwvY29kZT48L2NvZGU+IGtleXdvcmQ8L2gyPgotCi0KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLTxjb2RlPnNoYXJlZDwvY29kZT4gaW5kaWNhdGVzIGEgdmFyaWFibGUgaXMgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4KLTxwPgotPHByZT4KLXNoYXJlZCBpbnQgaTsKLXNoYXJlZCBbMl0gaW50IGFbMjAwXTsKLXN0cmljdCBzaGFyZWQgaW50IGk7Ci08L3ByZT4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdGVybXMuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdGVybXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmYTI1MC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3Rlcm1zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08aDQgaWQ9InRvcCI+VVBDIFRlcm1zLCBkZWZpbml0aW9ucyBhbmQgc3ltYm9sczwvaDQ+Ci08cD4KLUZvciB0aGUgcHVycG9zZSBvZiB0aGVzZSBzcGVjaWZpY2F0aW9ucyB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFwcGx5LgotCi08ZGw+Ci08ZHQ+PHN0cm9uZz48c3Ryb25nPnRocmVhZDwvc3Ryb25nPjwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hbiBpbnN0YW5jZSBvZiBleGVjdXRpb24gaW5pdGlhdGVkIGJ5IHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgYXQgcHJvZ3JhbQotc3RhcnR1cC48L2RkPgotCi08ZHQ+PHN0cm9uZz4gPC9zdHJvbmc+PC9kdD4KLTxkZD4gPC9kZD4KLQotPGR0PjxzdHJvbmc+b2JqZWN0PC9zdHJvbmc+PC9kdD4KLTxkZD4KLXJlZ2lvbiBvZiBkYXRhIHN0b3JhZ2UgaW4gdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB3aGljaCBjYW4gcmVwcmVzZW50Ci12YWx1ZXMuPC9kZD4KLQotPGR0PjxzdHJvbmc+c2hhcmVkIG9iamVjdCA8L3N0cm9uZz48L2R0PgotPGRkPgotYW4gb2JqZWN0IGFsbG9jYXRlZCB1c2luZyBhIHNoYXJlZC1xdWFsaWZpZWQgZGVjbGFyYXRvciBvciBieSBhIGxpYnJhcnkgZnVuY3Rpb24KLWRlZmluZWQgdG8gY3JlYXRlIHNoYXJlZCBvYmplY3RzLiAKLTxwPk5vdGU6IAotQWxsIHRocmVhZHMgbWF5IGFjY2VzcyBzaGFyZWQgb2JqZWN0cy48L2RkPgotCi08ZHQ+PHN0cm9uZz5wcml2YXRlIG9iamVjdDwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hbnkgb2JqZWN0IHdoaWNoIGlzIG5vdCBhIHNoYXJlZCBvYmplY3QuCi08cD5Ob3RlOiBFYWNoIHRocmVhZCBkZWNsYXJlcyBhbmQgY3JlYXRlcyBpdHMgb3duIHByaXZhdGUgb2JqZWN0cyB3aGljaCBubwotb3RoZXIgdGhyZWFkIGNhbiBhY2Nlc3MuPC9kZD4KLTxkdD48c3Ryb25nPiBzaGFyZWQgYXJyYXk8L3N0cm9uZz48L2R0PgotPGRkPgotYW4gYXJyYXkgd2l0aCBlbGVtZW50cyB0aGF0IGhhdmUgc2hhcmVkIHF1YWxpZmllZCB0eXBlLgotPC9kZD4KLTxkdD48c3Ryb25nPmFmZmluaXR5PC9zdHJvbmc+PC9kdD4KLTxkZD4KLWxvZ2ljYWwgYXNzb2NpYXRpb24gYmV0d2VlbiBzaGFyZWQgb2JqZWN0cyBhbmQgdGhyZWFkcy4gRWFjaCBlbGVtZW50IG9mIGRhdGEKLXN0b3JhZ2UgdGhhdCBjb250YWlucyBzaGFyZWQgb2JqZWN0cyBoYXMgYWZmaW5pdHkgdG8gZXhhY3RseSBvbmUgdGhyZWFkLgotPC9kZD4KLTxkdD48c3Ryb25nPnBvaW50ZXItdG8tc2hhcmVkPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWEgcG9pbnRlciB3aG9zZSByZWZlcmVuY2VkIHR5cGUgaXMgc2hhcmVkLXF1YWxpZmllZC4KLTwvZGQ+Ci08ZHQ+PHN0cm9uZz4gcG9pbnRlci10by1sb2NhbDwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHBvaW50ZXIgd2hvc2UgcmVmZXJlbmNlZCB0eXBlIGlzIG5vdCBzaGFyZWQtcXVhbGlmaWVkLgotPC9kZD4KLTxkdD48c3Ryb25nPmFjY2Vzczwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci0mbHQ7ZXhlY3V0aW9uLXRpbWUgYWN0aW9uJmd0OyB0byByZWFkIG9yIG1vZGlmeSB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGJ5IGEgdGhyZWFkLgotPHA+VGhlIGZpbGUgc2NvcGUgZGVjbGFyYXRpb24gaW50IHk7IGNyZWF0ZXMgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIGVhY2ggdGhyZWFkIHRvIGFjY2Vzcy4KLTwvZGQ+Ci08ZHQ+PHN0cm9uZz5zaGFyZWQgYWNjZXNzPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIGFjY2VzcyB1c2luZyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgc2hhcmVkLXF1YWxpZmllZC48L2RkPgotPGR0PjxzdHJvbmc+IHN0cmljdCBzaGFyZWQgcmVhZDwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHNoYXJlZCByZWFkIGFjY2VzcyB3aGljaCBpcyBkZXRlcm1pbmVkIHRvIGJlIHN0cmljdC48L2RkPgotPGR0PjxzdHJvbmc+c3RyaWN0IHNoYXJlZCB3cml0ZTwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHNoYXJlZCBtb2RpZnkgYWNjZXNzIHdoaWNoIGlzIGRldGVybWluZWQgdG8gYmUgc3RyaWN0IDwvZGQ+Ci08ZHQ+PHN0cm9uZz5yZWxheGVkIHNoYXJlZCByZWFkPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWEgc2hhcmVkIHJlYWQgYWNjZXNzIHdoaWNoIGlzIGRldGVybWluZWQgdG8gYmUgcmVsYXhlZDwvZGQ+Ci08ZHQ+PHN0cm9uZz5yZWxheGVkIHNoYXJlZCB3cml0ZTwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIHNoYXJlZCBtb2RpZnkgYWNjZXNzIHdoaWNoIGlzIGRldGVybWluZWQgdG8gYmUgcmVsYXhlZCA8L2RkPgotPGR0PjxzdHJvbmc+bG9jYWwgYWNjZXNzPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIGFjY2VzcyB1c2luZyBhbiBleHByZXNzaW9uIHdob3NlIHR5cGUgaXMgbm90IHNoYXJlZC1xdWFsaWZpZWQuCi08L2RkPgotPGR0PjxzdHJvbmc+Y29sbGVjdGl2ZTwvc3Ryb25nPjwvZHQ+Ci08ZGQ+Ci1hIGNvbnN0cmFpbnQgcGxhY2VkIG9uIHNvbWUgbGFuZ3VhZ2Ugb3BlcmF0aW9ucyB3aGljaCByZXF1aXJlcyBldmFsdWF0aW9uCi1vZiBzdWNoIG9wZXJhdGlvbnMgdG8gYmUgbWF0Y2hlZCBhY3Jvc3MgYWxsIHRocmVhZHMuIFRoZSBiZWhhdmlvciBvZiBjb2xsZWN0aXZlCi1vcGVyYXRpb25zIGlzIHVuZGVmaW5lZCB1bmxlc3MgYWxsIHRocmVhZHMgZXhlY3V0ZSB0aGUgc2FtZSBzZXF1ZW5jZSBvZgotY29sbGVjdGl2ZSBvcGVyYXRpb25zLjwvZGQ+Ci08ZHQ+PHN0cm9uZz5zaW5nbGUtdmFsdWVkPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIG9wZXJhbmQgdG8gYSBjb2xsZWN0aXZlIG9wZXJhdGlvbiwgd2hpY2ggaGFzIHRoZSBzYW1lIHZhbHVlIG9uIGV2ZXJ5Ci10aHJlYWQuIFRoZSBiZWhhdmlvciBvZiB0aGUgb3BlcmF0aW9uIGlzIG90aGVyd2lzZSB1bmRlZmluZWQuPC9kZD4KLTxkdD48c3Ryb25nPnBoYXNlPC9zdHJvbmc+PC9kdD4KLTxkZD4KLWFuIHVuc2lnbmVkIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcG9pbnRlci10by1zaGFyZWQgd2hpY2ggaW5kaWNhdGVzCi10aGUgZWxlbWVudC1vZmZzZXQgd2l0aGluIGFuIGFmZmluaXR5IGJsb2NrOyB1c2VkIGluIHBvaW50ZXItdG8tc2hhcmVkCi1hcml0aG1ldGljIHRvIGRldGVybWluZSBhZmZpbml0eSBib3VuZGFyaWVzPC9kZD4KLTwvZGw+Ci08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gIHRvcDwvYT4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWRkcmZpZWxkLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hZGRyZmllbGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxMzNlNjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWRkcmZpZWxkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19hZGRyZmllbGQ8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaXplX3QgdXBjX2FkZHJmaWVsZChzaGFyZWQgdm9pZCAqcHRyKTsgICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSA8Y29kZT51cGNfYWRkcmZpZWxkIDwvY29kZT4gIGZ1bmN0aW9uIHJldHVybnMgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZSByZWZsZWN0aW5nCi10aGUgPHE+bG9jYWwgYWRkcmVzczwvcT5vZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIHBvaW50ZXItdG8tc2hhcmVkCi1hcmd1bWVudC4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FmZmluaXR5c2l6ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWZmaW5pdHlzaXplLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmI4MWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWZmaW5pdHlzaXplLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19hZmZpbml0eXNpemU8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaXplX3QgdXBjX2FmZmluaXR5c2l6ZShzaXplX3QgdG90YWxzaXplLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aHJlYWRpZCk7ICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSA8Y29kZT51cGNfYWZmaW5pdHlzaXplIDwvY29kZT4gIGZ1bmN0aW9uIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyB0aGUgZXhhY3Qgc2l6ZQotb2YgdGhlIGxvY2FsIHBvcnRpb24gb2YgdGhlIGRhdGEgaW4gYSBzaGFyZWQgb2JqZWN0IHdpdGggYWZmaW5pdHkgdG8gPGNvZGU+dGhyZWFkaWQ8L2NvZGU+LgotPHA+SW4gdGhlIGNhc2Ugb2YgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc2hhcmVkIG9iamVjdCwgdGhlIDxjb2RlPnRvdGFsc2l6ZTwvY29kZT4gYXJndW1lbnQKLXNoYWxsIGJlIDxjb2RlPm5ieXRlcypuYmxvY2tzPC9jb2RlPiBhbmQgdGhlIDxjb2RlPm5ieXRlczwvY29kZT4gYXJndW1lbnQgc2hhbGwgYmUgPGNvZGU+bmJ5dGVzPC9jb2RlPiwKLXdoZXJlIDxjb2RlPm5ibG9ja3M8L2NvZGU+IGFuZCA8Y29kZT5uYnl0ZXM8L2NvZGU+IGFyZSBleGFjdGx5IGFzIHBhc3NlZCB0byA8Y29kZT51cGNfZ2xvYmFsX2FsbG9jPC9jb2RlPiBvcgotPGNvZGU+dXBjX2FsbF9hbGxvYzwvY29kZT4gd2hlbiB0aGUgb2JqZWN0IHdhcyBhbGxvY2F0ZWQuCi08cD5JbiB0aGUgY2FzZSBvZiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHNoYXJlZCBvYmplY3Qgd2l0aCBkZWNsYXJhdGlvbjoKLTxwcmU+Ci0gICBzaGFyZWQgW2JdIHQgZFtzXTsKLSAgIDwvcHJlPgotdGhlIDxjb2RlPnRvdGFsc2l6ZTwvY29kZT4gYXJndW1lbnQgc2hhbGwgYmUgPGNvZGU+cyAqIHNpemVvZih0KTwvY29kZT4gYW5kIHRoZSA8Y29kZT5uYnl0ZXM8L2NvZGU+IGFyZ3VtZW50Ci1zaGFsbCBiZSA8Y29kZT5iICogc2l6ZW9mKHQpPC9jb2RlPi4gSWYgdGhlIGJsb2NrIHNpemUgaXMgaW5kZWZpbml0ZSwgPGNvZGU+bmJ5dGVzPC9jb2RlPiBzaGFsbCBiZSAwLgotPHA+PGNvZGU+dGhyZWFkaWQ8L2NvZGU+IHNoYWxsIGJlIGEgdmFsdWUgaW4gPGNvZGU+MC4uKFRIUkVBRFMtMSk8L2NvZGU+LgotCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2FsbG9jLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfYWxsb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiMDk0My4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19hbGxfYWxsb2M8L2NvZGU+ICAgICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHNoYXJlZCB2b2lkICp1cGNfYWxsX2FsbG9jKHNpemVfdCBuYmxvY2tzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGVzKTsgICAKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2FsbG9jICAgPC9jb2RlPiBmdW5jdGlvbiBhbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIGNvbXBhdGlibGUgd2l0aCB0aGUgZm9sbG93aW5nCi1kZWNsYXJhdGlvbjoKLTxwPjxjb2RlPgotc2hhcmVkIFtuYnl0ZXNdIGNoYXJbbmJsb2NrcyAqIG5ieXRlc10uCi08L2NvZGU+PC9wPgotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbF9hbGxvYyAgIDwvY29kZT4gZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBwb2ludGVyIHZhbHVlIG9uIGFsbCB0aHJlYWRzLgotSWYgbmJsb2NrcypuYnl0ZXMgaXMgemVybywgdGhlIHJlc3VsdCBpcyBhIG51bGwgcG9pbnRlci10by1zaGFyZWQuCi08cD5UaGUgZHluYW1pYyBsaWZldGltZSBvZiBhbiBhbGxvY2F0ZWQgb2JqZWN0IGV4dGVuZHMgZnJvbSB0aGUgdGltZSBhbnkgdGhyZWFkCi1jb21wbGV0ZXMgdGhlIGNhbGwgdG8gPGNvZGU+dXBjX2FsbF9hbGxvYyAgIDwvY29kZT4gdW50aWwgYW55IHRocmVhZCBoYXMgZGVhbGxvY2F0ZWQgdGhlCi1vYmplY3QuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2Jyb2FkY2FzdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2Jyb2FkY2FzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzQ5MDNjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbF9icm9hZGNhc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTxoMj5UaGUgPGNvZGU+dXBjX2FsbF9icm9hZGNhc3Q8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLTxoND5QdXJwb3NlPC9oND4KLTxwPkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfYnJvYWRjYXN0KHNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG5ieXRlcywgdXBjX2ZsYWdfdCBmbGFncyk7ICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2Jyb2FkY2FzdCA8L2NvZGU+ICBmdW5jdGlvbiAgCi1jb3BpZXMgYSBibG9jayBvZiBtZW1vcnkgd2l0aCBhZmZpbml0eSB0bwotYSBzaW5nbGUgdGhyZWFkIHRvIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeSBvbiBlYWNoIHRocmVhZC4gVGhlIG51bWJlciBvZgotYnl0ZXMgaW4gZWFjaCBibG9jayBpcyA8Y29kZT5uYnl0ZXM8L2NvZGU+LgotPHA+PGNvZGU+bmJ5dGVzPC9jb2RlPiBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLgotPHA+PGNvZGU+dXBjX2FsbF9icm9hZGNhc3QgPC9jb2RlPiBmdW5jdGlvbiB0cmVhdHMgdGhlIDxjb2RlPnNyYzwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEKLXNoYXJlZCBtZW1vcnkgYXJlYSB3aXRoIHRoZSB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW10gY2hhcltuYnl0ZXNdCi0gICAgPC9wcmU+Ci08cD5UaGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgZW50aXJlIGFycmF5IHBvaW50ZWQgdG8gYnkgPGNvZGU+c3JjPC9jb2RlPiB0byBlYWNoCi1ibG9jayBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIG9mIGEgc2hhcmVkIGFycmF5IDxjb2RlPmRzdDwvY29kZT4gd2l0aCB0aGUgdHlwZToKLTxwcmU+Ci0gICAgc2hhcmVkIFtuYnl0ZXNdIGNoYXJbbmJ5dGVzICogVEhSRUFEU10KLTwvcHJlPgotPHA+VGhlIHRhcmdldCBvZiB0aGUgPGNvZGU+ZHN0PC9jb2RlPiBwb2ludGVyIG11c3QgaGF2ZSBhZmZpbml0eSB0byB0aHJlYWQgMC4KLTxwPlRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIgaXMgdHJlYXRlZCBhcyBpZiBpdCBoYXMgcGhhc2UgMC4KLQotPHVsPgotPGxpPkVYQU1QTEUgMSBzaG93cyB1cGNfYWxsX2Jyb2FkY2FzdAotCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci1zaGFyZWQgaW50IEFbVEhSRUFEU107Ci1zaGFyZWQgaW50IEJbVEhSRUFEU107Ci0vLyBJbml0aWFsaXplIEEuCi11cGNfYmFycmllcjsKLXVwY19hbGxfYnJvYWRjYXN0KCBCLCAmQVsxXSwgc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICAgICAgVVBDX0lOX05PU1lOQyB8IFVQQ19PVVRfTk9TWU5DICk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotCi08bGk+RVhBTVBMRSAyOgotCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtdIGludCBBW05FTEVNU107Ci1zaGFyZWQgW05FTEVNU10gaW50IEJbTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2FsbF9icm9hZGNhc3QoIEIsIEEsIHNpemVvZihpbnQpKk5FTEVNUywKLSAgICAgICAgICAgICAgICAgICBVUENfSU5fQUxMU1lOQyB8IFVQQ19PVVRfQUxMU1lOQyApOwotPC9wcmU+Ci08bGk+RVhBTVBMRSAzIHNob3dzIDxjb2RlPihBWzNdLEFbNF0pPC9jb2RlPiBpcyBicm9hZGNhc3QgdG8gPGNvZGU+KEJbMF0sQlsxXSksIChCWzEwXSxCWzExXSksCi0oQlsyMF0sQlsyMV0pLCAuLi4sIChCW05FTEVNUyooVEhSRUFEUy0xKV0sQltORUxFTVMqKFRIUkVBRFMtMSkrMV0pLjwvY29kZT4KLQotPHByZT4KLSNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSNpbmNsdWRlICZsdDt1cGNfY29sbGVjdGl2ZS5oJmd0OwotI2RlZmluZSBORUxFTVMgMTAKLXNoYXJlZCBbTkVMRU1TXSBpbnQgQVtORUxFTVMqVEhSRUFEU107Ci1zaGFyZWQgW05FTEVNU10gaW50IEJbTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2JhcnJpZXI7Ci11cGNfYWxsX2Jyb2FkY2FzdCggQiwgJkFbM10sIHNpemVvZihpbnQpKjIsCi0gICAgICAgICAgICAgICAgICAgVVBDX0lOX05PU1lOQyB8IFVQQ19PVVRfTk9TWU5DICk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotPC91bD4KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2V4Y2hhbmdlLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZXhjaGFuZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1MDMzOC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZXhjaGFuZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTxoMj5UaGUgPGNvZGU+dXBjX2FsbF9leGNoYW5nZTwvY29kZT4gZnVuY3Rpb24gICAgIDwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0gICAgdm9pZCB1cGNfYWxsX2V4Y2hhbmdlKHNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzKTsgIAotICAgIDwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2V4Y2hhbmdlICAgPC9jb2RlPiBmdW5jdGlvbiAgIGNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkCi1tZW1vcnkgYXJlYSB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaiB0byB0aGUganRoIGJsb2NrIG9mIGEgc2hhcmVkIG1lbW9yeQotYXJlYSB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaS4gVGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIGlzCi08Y29kZT5uYnl0ZXM8L2NvZGU+LgotPHA+PGNvZGU+bmJ5dGVzPC9jb2RlPiBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLgotPHA+Ci08cD5UaGUgPGNvZGU+dXBjX2FsbF9leGNoYW5nZSAgIDwvY29kZT4gZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgYW5kIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIKLWFzIGlmIGVhY2ggcG9pbnRlZCB0byBhIHNoYXJlZCBtZW1vcnkgYXJlYSBvZiA8Y29kZT5uYnl0ZXMgKiBUSFJFQURTPC9jb2RlPgMgYnl0ZXMgb24gZWFjaAotdGhyZWFkIGFuZCB0aGVyZWZvcmUgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbbmJ5dGVzICogVEhSRUFEU10gY2hhcltuYnl0ZXMgKiBUSFJFQURTICogVEhSRUFEU10KLTwvcHJlPgotPHA+VGhlIHRhcmdldHMgb2YgdGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgbXVzdCBoYXZlIGFmZmluaXR5IHRvIHRocmVhZCAwLgotPHA+VGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYXZlIHBoYXNlIDAuCi08cD5Gb3IgZWFjaCBwYWlyIG9mIHRocmVhZHMgaSBhbmQgaiwgdGhlIGVmZmVjdCBpcyBlcXVpdmFsZW50IHRvIGNvcHlpbmcgdGhlIGl0aAotYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaiBwb2ludGVkIHRvIGJ5IDxjb2RlPnNyYzwvY29kZT4gdG8gdGhlCi1qdGggYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB0aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgaSBwb2ludGVkIHRvIGJ5IDxjb2RlPmRzdDwvY29kZT4uCi08dWw+Ci08bGk+RVhBTVBMRSAxIDxjb2RlPnVwY19hbGxfZXhjaGFuZ2UgICA8L2NvZGU+IGZvciB0aGUgc3RhdGljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtORUxFTVMqVEhSRUFEU10gaW50IEFbVEhSRUFEU11bTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtORUxFTVMqVEhSRUFEU10gaW50IEJbVEhSRUFEU11bTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2JhcnJpZXI7Ci11cGNfYWxsX2V4Y2hhbmdlKCBCLCBBLCBORUxFTVMqc2l6ZW9mKGludCksCi1VUENfSU5fTk9TWU5DIHwgVVBDX09VVF9OT1NZTkMgKTsKLXVwY19iYXJyaWVyOwotPC9wcmU+Ci0KLTxsaT5FWEFNUExFIDIgPGNvZGU+dXBjX2FsbF9leGNoYW5nZSAgIDwvY29kZT4gZm9yIHRoZSBkeW5hbWljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIGludCAqQWRhdGEsICpCZGF0YTsKLXNoYXJlZCBbXSBpbnQgKm15QSwgKm15QjsKLWludCBpOwotCi1BZGF0YSA9IHVwY19hbGxfYWxsb2MoVEhSRUFEUypUSFJFQURTLCBORUxFTVMqc2l6ZW9mKGludCkpOwotbXlBID0gKHNoYXJlZCBbXSBpbnQgKikmQWRhdGFbTVlUSFJFQURdOwotQmRhdGEgPSB1cGNfYWxsX2FsbG9jKFRIUkVBRFMqVEhSRUFEUywgTkVMRU1TKnNpemVvZihpbnQpKTsKLW15QiA9IChzaGFyZWQgW10gaW50ICopJkJkYXRhW01ZVEhSRUFEXTsKLS8vIEFkYXRhIGFuZCBCZGF0YSBjb250YWluIFRIUkVBRFMqVEhSRUFEUypORUxFTVMgZWxlbWVudHMuCi0vLyBteUEgYW5kIG15QiBhcmUgTVlUSFJFQUQncyByb3dzIG9mIEFkYXRhIGFuZCBCZGF0YSwgcmVzcC4KLS8vIEluaXRpYWxpemUgTVlUSFJFQUQncyByb3cgb2YgQS4gRm9yIGV4YW1wbGUsCi1mb3IgKGk9MDsgaSZsdDtORUxFTVMqVEhSRUFEUzsgaSsrKQotbXlBW2ldID0gTVlUSFJFQUQqMTAgKyBpOwotdXBjX2FsbF9leGNoYW5nZSggQmRhdGEsIEFkYXRhLCBORUxFTVMqc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICAgICBVUENfSU5fQUxMU1lOQyB8IFVQQ19PVVRfQUxMU1lOQyApOwotPC9wcmU+Ci08L3VsPgotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTU1Y2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2dhdGhlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX2dhdGhlcjwvY29kZT4gZnVuY3Rpb248L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHByZT4gICAgCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgICNpbmNsdWRlICZsdDt1cGNfY29sbGVjdGl2ZS5oJmd0OwotICAgIHZvaWQgdXBjX2FsbF9nYXRoZXIoc2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ieXRlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGNfZmxhZ190IGZsYWdzKTsgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLTxwPgotVGhlIDxjb2RlPnVwY19hbGxfZ2F0aGVyIDwvY29kZT4gIGZ1bmN0aW9uIAotY29waWVzIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeSB0aGF0IGhhcwotYWZmaW5pdHkgdG8gdGhlIGl0aCB0aHJlYWQgdG8gdGhlIGl0aCBibG9jayBvZiBhIHNoYXJlZCBtZW1vcnkgYXJlYSB0aGF0IGhhcwotYWZmaW5pdHkgdG8gYSBzaW5nbGUgdGhyZWFkLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggYmxvY2sgaXMgPGNvZGU+bmJ5dGVzPC9jb2RlPi4KLTxwPjxjb2RlPm5ieXRlczwvY29kZT4gbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC4KLTxwPlRoZSB1cGMgYWxsIGdhdGhlciBmdW5jdGlvbiB0cmVhdHMgdGhlIDxjb2RlPnNyYzwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEKLXNoYXJlZCBtZW1vcnkgYXJlYSBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIG9uIGVhY2ggdGhyZWFkIGFuZCB0aGVyZWZvcmUgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbbmJ5dGVzXSBjaGFyW25ieXRlcyAqIFRIUkVBRFNdCi08L3ByZT4KLTxwPmFuZCBpdCB0cmVhdHMgdGhlIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHdpdGgKLXRoZSB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW10gY2hhcltuYnl0ZXMgKiBUSFJFQURTXQotICAgIDwvcHJlPgotPHA+VGhlIHRhcmdldCBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVyIG11c3QgaGF2ZSBhZmZpbml0eSB0byB0aHJlYWQgMC4KLTxwPlRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgaXMgdHJlYXRlZCBhcyBpZiBpdCBoYXMgcGhhc2UgMC4KLTxwPkZvciBlYWNoIHRocmVhZCBpLCB0aGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcwotcG9pbnRlZCB0byBieSA8Y29kZT5zcmM8L2NvZGU+IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBpIHRvIHRoZSBpdGggYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPgotYnl0ZXMgcG9pbnRlZCB0byBieSA8Y29kZT5kc3Q8L2NvZGU+LgotPHA+Ci08dWw+Ci08bGk+RVhBTVBMRSAxIDxjb2RlPnVwY19hbGxfZ2F0aGVyIDwvY29kZT4gZm9yIHRoZSBzdGF0aWMgVEhSRUFEUyB0cmFuc2xhdGlvbiBlbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW05FTEVNU10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtdIGludCBCW05FTEVNUypUSFJFQURTXTsKLS8vIEluaXRpYWxpemUgQS4KLXVwY19hbGxfZ2F0aGVyKCBCLCBBLCBzaXplb2YoaW50KSpORUxFTVMsCi1VUENfSU5fQUxMU1lOQyB8IFVQQ19PVVRfQUxMU1lOQyApOwotPC9wcmU+Ci08bGk+RVhBTVBMRSAyIDxjb2RlPnVwY19hbGxfZ2F0aGVyIDwvY29kZT4gZm9yIHRoZSBkeW5hbWljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtORUxFTVNdIGludCBBW05FTEVNUypUSFJFQURTXTsKLXNoYXJlZCBbXSBpbnQgKkI7Ci1CID0gKHNoYXJlZCBbXSBpbnQgKikgdXBjX2FsbF9hbGxvYygxLE5FTEVNUypUSFJFQURTKnNpemVvZihpbnQpKTsKLS8vIEluaXRpYWxpemUgQS4KLXVwY19iYXJyaWVyOwotdXBjX2FsbF9nYXRoZXIoIEIsIEEsIHNpemVvZihpbnQpKk5FTEVNUywKLVVQQ19JTl9OT1NZTkMgfCBVUENfT1VUX05PU1lOQyApOwotdXBjX2JhcnJpZXI7Ci08L3ByZT4KLTxsaT4KLTxsaT4KLTwvdWw+Ci08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPjxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyX2FsbC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX2dhdGhlcl9hbGwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMTk5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfZ2F0aGVyX2FsbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX2dhdGhlcl9hbGw8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfZ2F0aGVyX2FsbChzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGNfZmxhZ190IGZsYWdzKTsKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsIDwvY29kZT4gIGZ1bmN0aW9uIAotY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gb25lIHNoYXJlZAotbWVtb3J5IGFyZWEgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZCB0byB0aGUgaXRoIGJsb2NrIG9mIGEgc2hhcmVkCi1tZW1vcnkgYXJlYSBvbiBlYWNoIHRocmVhZC4gVGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIGlzIDxjb2RlPm5ieXRlczwvY29kZT4uCi08cD48Y29kZT5uYnl0ZXM8L2NvZGU+IG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIDAuCi08cD5UaGUgdXBjX2FsbF9nYXRoZXJfYWxsIGZ1bmN0aW9uIHRyZWF0cyB0aGUgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVyIGFzIGlmIGl0IHBvaW50ZWQgdG8gYQotc2hhcmVkIG1lbW9yeSBhcmVhIG9mIDxjb2RlPm5ieXRlczwvY29kZT4gYnl0ZXMgb24gZWFjaCB0aHJlYWQgYW5kIHRoZXJlZm9yZSBoYWQgdHlwZToKLTxwcmU+Ci1zaGFyZWQgW25ieXRlc10gY2hhcltuYnl0ZXMgKiBUSFJFQURTXQotPC9wcmU+Ci08cD5hbmQgaXQgdHJlYXRzIHRoZSA8Y29kZT5kc3Q8L2NvZGU+ICBwb2ludGVyIGFzIGlmIGl0IHBvaW50ZWQgdG8gYSBzaGFyZWQgbWVtb3J5IGFyZWEgd2l0aAotdGhlIHR5cGU6Ci1zaGFyZWQgW25ieXRlcyAqIFRIUkVBRFNdIGNoYXJbbmJ5dGVzICogVEhSRUFEUyAqIFRIUkVBRFNdCi08cD5UaGUgdGFyZ2V0cyBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiBhbmQgPGNvZGU+ZHN0PC9jb2RlPiBwb2ludGVycyBtdXN0IGhhdmUgYWZmaW5pdHkgdG8gdGhyZWFkIDAuCi08cD5UaGUgPGNvZGU+c3JjPC9jb2RlPiBhbmQgPGNvZGU+ZHN0PC9jb2RlPiAgcG9pbnRlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYXZlIHBoYXNlIDAuCi08cD5UaGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgaXRoIGJsb2NrIG9mIDxjb2RlPm5ieXRlczwvY29kZT4gYnl0ZXMgcG9pbnRlZCB0bwotYnkgPGNvZGU+c3JjPC9jb2RlPiB0byB0aGUgaXRoIGJsb2NrIG9mIDxjb2RlPm5ieXRlczwvY29kZT4gYnl0ZXMgcG9pbnRlZCB0byBieSA8Y29kZT5kc3Q8L2NvZGU+IHRoYXQgaGFzIGFmZmluaXR5Ci10byBlYWNoIHRocmVhZC4KLQotCi0KLTxwPgotPHVsPgotPGxpPiBFWEFNUExFIDEgPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsIDwvY29kZT4gZm9yIHRoZSBzdGF0aWMgVEhSRUFEUyB0cmFuc2xhdGlvbiBlbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW05FTEVNU10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtORUxFTVMqVEhSRUFEU10gaW50IEJbVEhSRUFEU11bTkVMRU1TKlRIUkVBRFNdOwotLy8gSW5pdGlhbGl6ZSBBLgotdXBjX2JhcnJpZXI7Ci11cGNfYWxsX2dhdGhlcl9hbGwoIEIsIEEsIHNpemVvZihpbnQpKk5FTEVNUywKLVVQQ19JTl9OT1NZTkMgfCBVUENfT1VUX05PU1lOQyApOwotdXBjX2JhcnJpZXI7Ci08L3ByZT4KLTxsaT5FWEFNUExFIDIgPGNvZGU+dXBjX2FsbF9nYXRoZXJfYWxsIDwvY29kZT4gYWxsIGZvciB0aGUgZHluYW1pYyBUSFJFQURTIHRyYW5zbGF0aW9uCi1lbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW05FTEVNU10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIGludCAqQmRhdGE7Ci1zaGFyZWQgW10gaW50ICpteUI7Ci1CZGF0YSA9IHVwY19hbGxfYWxsb2MoVEhSRUFEUypUSFJFQURTLCBORUxFTVMqc2l6ZW9mKGludCkpOwotbXlCID0gKHNoYXJlZCBbXSBpbnQgKikmQmRhdGFbTVlUSFJFQURdOwotLy8gQmRhdGEgY29udGFpbnMgVEhSRUFEUypUSFJFQURTKk5FTEVNUyBlbGVtZW50cy4KLS8vIG15QiBpcyBNWVRIUkVBRNVzIHJvdyBvZiBCZGF0YS4KLS8vIEluaXRpYWxpemUgQS4KLXVwY19hbGxfZ2F0aGVyX2FsbCggQmRhdGEsIEEsIE5FTEVNUypzaXplb2YoaW50KSwKLVVQQ19JTl9BTExTWU5DIHwgVVBDX09VVF9BTExTWU5DICk7Ci08L3ByZT4KLTxsaT4KLTxsaT4KLTwvdWw+Ci08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbF9sb2NrX2FsbG9jLmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfbG9ja19hbGxvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjYyOTEzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbF9sb2NrX2FsbG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08aDIgPlRoZSA8Y29kZT51cGNfYWxsX2xvY2tfYWxsb2M8L2NvZGU+IGZ1bmN0aW9uICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB1cGNfbG9ja190ICp1cGNfYWxsX2xvY2tfYWxsb2Modm9pZCk7ICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfYWxsX2xvY2tfYWxsb2M8L2NvZGU+ICAgIGZ1bmN0aW9uIGR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhIGxvY2sgYW5kIHJldHVybnMKLWEgcG9pbnRlciB0byBpdC4gVGhlIGxvY2sgaXMgY3JlYXRlZCBpbiBhbiB1bmxvY2tlZCBzdGF0ZS4KLTxwPlRoZSA8Y29kZT51cGNfYWxsX2xvY2tfYWxsb2M8L2NvZGU+ICBmdW5jdGlvbiBpcyAgYSA8aT5jb2xsZWN0aXZlPC9pPiBmdW5jdGlvbi4gCi1UaGUgcmV0dXJuIHZhbHVlIG9uIGV2ZXJ5Ci10aHJlYWQgcG9pbnRzIHRvIHRoZSBzYW1lIGxvY2sgb2JqZWN0LgotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfcGVybXV0ZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX3Blcm11dGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiOTNiNC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfcGVybXV0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX3Blcm11dGU8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfcGVybXV0ZShzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwKLSAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsCi0gICAgICAgIHNoYXJlZCBjb25zdCBpbnQgKiByZXN0cmljdCBwZXJtLAotICAgICAgICBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzKTsKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbF9wZXJtdXRlIDwvY29kZT4gIGZ1bmN0aW9uIAotY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gYSBzaGFyZWQgbWVtb3J5Ci1hcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIGEgYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5Ci10aGF0IGhhcyBhZmZpbml0eSB0byB0aHJlYWQgcGVybVtpXS4gVGhlIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIGJsb2NrIGlzCi08Y29kZT5uYnl0ZXM8L2NvZGU+LgotPHA+PGNvZGU+bmJ5dGVzPC9jb2RlPiBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiAwLgotPHA+PGNvZGU+cGVybVswLi5USFJFQURTLTFdPC9jb2RlPiBtdXN0IGNvbnRhaW4gPGNvZGU+VEhSRUFEUzwvY29kZT4KLWRpc3RpbmN0IHZhbHVlczogCi08Y29kZT4wLCAxLCAuLi4sIFRIUkVBRFMtMS48L2NvZGU+Ci08cD5UaGUgPGNvZGU+dXBjX2FsbF9wZXJtdXRlIDwvY29kZT4gZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgYW5kIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIKLWFzIGlmIGVhY2ggcG9pbnRlZCB0byBhIHNoYXJlZCBtZW1vcnkgYXJlYSBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIG9uIGVhY2ggdGhyZWFkCi1hbmQgdGhlcmVmb3JlIGhhZCB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgWzxjb2RlPm5ieXRlczwvY29kZT5dIGNoYXJbPGNvZGU+bmJ5dGVzPC9jb2RlPiAqIFRIUkVBRFNdCi0gICAgPC9wcmU+Ci08cD5UaGUgdGFyZ2V0cyBvZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiwgcGVybSwgYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgbXVzdCBoYXZlIGFmZmluaXR5IHRvIHRocmVhZCAwLgotPHA+VGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYXZlIHBoYXNlIDAuCi08cD5UaGUgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8gY29weWluZyB0aGUgYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB0aGF0IGhhcyBhZmZpbml0eQotdG8gdGhyZWFkIGkgcG9pbnRlZCB0byBieSA8Y29kZT5zcmM8L2NvZGU+IHRvIHRoZSBibG9jayBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIHRoYXQgaGFzIGFmZmluaXR5Ci10byB0aHJlYWQgcGVybVtpXSBwb2ludGVkIHRvIGJ5IDxjb2RlPmRzdDwvY29kZT4uCi08dWw+Ci08bGk+RVhBTVBMRSAxOiA8Y29kZT51cGNfYWxsX3Blcm11dGU8L2NvZGU+Ci08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5FTEVNUyAxMAotc2hhcmVkIFtORUxFTVNdIGludCBBW05FTEVNUypUSFJFQURTXSwgQltORUxFTVMqVEhSRUFEU107Ci1zaGFyZWQgaW50IFBbVEhSRUFEU107Ci0vLyBJbml0aWFsaXplIEEgYW5kIFAuCi11cGNfYmFycmllcjsKLXVwY19hbGxfcGVybXV0ZSggQiwgQSwgUCwgc2l6ZW9mKGludCkqTkVMRU1TLAotVVBDX0lOX05PU1lOQyB8IFVQQ19PVVRfTk9TWU5DICk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotCi08L3VsPgotCi0gCi08L3VsPgotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfc2NhdHRlci5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsX3NjYXR0ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMWU5Mi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19hbGxfc2NhdHRlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPGgyPlRoZSA8Y29kZT51cGNfYWxsX3NjYXR0ZXI8L2NvZGU+IGZ1bmN0aW9uPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+ICAgIAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSAgICB2b2lkIHVwY19hbGxfc2NhdHRlcihzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwY19mbGFnX3QgZmxhZ3MpOwotICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLTxwPgotVGhlIDxjb2RlPnVwY19hbGxfc2NhdHRlciA8L2NvZGU+ICBmdW5jdGlvbiAKLWNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIGFuIGFyZWEgb2Ygc2hhcmVkCi1tZW1vcnkgd2l0aCBhZmZpbml0eSB0byBhIHNpbmdsZSB0aHJlYWQgdG8gYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5IHdpdGgKLWFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggYmxvY2sgaXMgPGNvZGU+bmJ5dGVzPC9jb2RlPi4KLTxwPjxjb2RlPm5ieXRlczwvY29kZT4gbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gMC4KLTxwPlRoZSA8Y29kZT51cGNfYWxsX3NjYXR0ZXIgPC9jb2RlPiAgZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IHBvaW50ZXIgYXMgaWYgaXQgcG9pbnRlZCB0byBhCi1zaGFyZWQgbWVtb3J5IGFyZWEgd2l0aCB0aGUgdHlwZToKLTxwcmU+Ci0gICAgc2hhcmVkIFtdIGNoYXJbbmJ5dGVzICogVEhSRUFEU10KLSA8L3ByZT4KLTxwPmFuZCBpdCB0cmVhdHMgdGhlIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlciBhcyBpZiBpdCBwb2ludGVkIHRvIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHdpdGgKLXRoZSB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW25ieXRlc10gY2hhcltuYnl0ZXMgKiBUSFJFQURTXQotPC9wcmU+Ci08cD5UaGUgdGFyZ2V0IG9mIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIgbXVzdCBoYXZlIGFmZmluaXR5IHRvIHRocmVhZCAwLgotPHA+VGhlIDxjb2RlPmRzdDwvY29kZT4gcG9pbnRlciBpcyB0cmVhdGVkIGFzIGlmIGl0IGhhcyBwaGFzZSAwLgotPHA+Rm9yIGVhY2ggdGhyZWFkIGksIHRoZSBlZmZlY3QgaXMgZXF1aXZhbGVudCB0byBjb3B5aW5nIHRoZSBpdGggYmxvY2sgb2YgPGNvZGU+bmJ5dGVzPC9jb2RlPgotYnl0ZXMgcG9pbnRlZCB0byBieSA8Y29kZT5zcmM8L2NvZGU+IHRvIHRoZSBibG9jayBvZiA8Y29kZT5uYnl0ZXM8L2NvZGU+IGJ5dGVzIHBvaW50ZWQgdG8gYnkgCi08Y29kZT5kc3Q8L2NvZGU+IHRoYXQKLWhhcyBhZmZpbml0eSB0byB0aHJlYWQgaS4KLTx1bD4KLTxsaT5FWEFNUExFIDE6IDxjb2RlPnVwY19hbGxfc2NhdHRlcjwvY29kZT4gZm9yIHRoZSBkeW5hbWljIFRIUkVBRFMgdHJhbnNsYXRpb24gZW52aXJvbm1lbnQuCi08cHJlPgotI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotI2luY2x1ZGUgJmx0O3VwY19jb2xsZWN0aXZlLmgmZ3Q7Ci0jZGVmaW5lIE5VTUVMRU1TIDEwCi0jZGVmaW5lIFNSQ19USFJFQUQgMQotc2hhcmVkIGludCAqQTsKLXNoYXJlZCBbXSBpbnQgKm15QSwgKnNyY0E7Ci1zaGFyZWQgW05VTUVMRU1TXSBpbnQgQltOVU1FTEVNUypUSFJFQURTXTsKLS8vIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGFycmF5IGRpc3RyaWJ1dGVkIGFjcm9zcyBhbGwgdGhyZWFkcwotQSA9IHVwY19hbGxfYWxsb2MoVEhSRUFEUywgVEhSRUFEUypOVU1FTEVNUypzaXplb2YoaW50KSk7Ci1teUEgPSAoc2hhcmVkIFtdIGludCAqKSAmQVtNWVRIUkVBRF07Ci1mb3IgKGk9MDsgaTxOVU1FTEVNUypUSFJFQURTOyBpKyspCi1teUFbaV0gPSBpICsgTlVNRUxFTVMqVEhSRUFEUypNWVRIUkVBRDsgLy8gKGZvciBleGFtcGxlKQotLy8gc2NhdHRlciB0aGUgU1JDX1RIUkVBRNVzIHJvdyBvZiB0aGUgYXJyYXkKLXNyY0EgPSAoc2hhcmVkIFtdIGludCAqKSAmQVtTUkNfVEhSRUFEXTsKLXVwY19iYXJyaWVyOwotdXBjX2FsbF9zY2F0dGVyKCBCLCBzcmNBLCBzaXplb2YoaW50KSpOVU1FTEVNUywKLVVQQ19JTl9OT1NZTkMgfCBVUENfT1VUX05PU1lOQyk7Ci11cGNfYmFycmllcjsKLTwvcHJlPgotPGxpPkVYQU1QTEUgMjogPGNvZGU+dXBjX2FsbF9zY2F0dGVyPC9jb2RlPiAgZm9yIHRoZSBzdGF0aWMgVEhSRUFEUyB0cmFuc2xhdGlvbiBlbnZpcm9ubWVudC4KLTxwcmU+Ci0jaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7dXBjX2NvbGxlY3RpdmUuaCZndDsKLSNkZWZpbmUgTkVMRU1TIDEwCi1zaGFyZWQgW10gaW50IEFbTkVMRU1TKlRIUkVBRFNdOwotc2hhcmVkIFtORUxFTVNdIGludCBCW05FTEVNUypUSFJFQURTXTsKLSAKLS8vIEluaXRpYWxpemUgQS4KLXVwY19hbGxfc2NhdHRlciggQiwgQSwgc2l6ZW9mKGludCkqTkVMRU1TLAotVVBDX0lOX0FMTFNZTkMgfCBVUENfT1VUX0FMTFNZTkMgKTsKLTwvcHJlPgotIAotPC91bD4KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2FsbG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTRiYjAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19hbGxvYzwvY29kZT4gZnVuY3Rpb24gICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaGFyZWQgdm9pZCAqdXBjX2FsbG9jKHNpemVfdCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX2FsbG9jICA8L2NvZGU+IGFsbG9jYXRlcyBzaGFyZWQgc3BhY2Ugb2YgYXQgbGVhc3QgPGNvZGU+bmJ5dGVzPC9jb2RlPiBieXRlcyB3aXRoCi1hZmZpbml0eSB0byB0aGUgY2FsbGluZyB0aHJlYWQuCi08cD4KLTxjb2RlPnVwY19hbGxvYzwvY29kZT4gaXMgc2ltaWxhciB0byBtYWxsb2MoKSBleGNlcHQgdGhhdCBpdCByZXR1cm5zIGEgcG9pbnRlci10by1zaGFyZWQKLXZhbHVlLiBJdCBpcyBub3QgYSA8aT5jb2xsZWN0aXZlPC9pPiBmdW5jdGlvbi4gSWYgPGNvZGU+bmJ5dGVzPC9jb2RlPiBpcyB6ZXJvLCB0aGUgcmVzdWx0IGlzIGEgbnVsbAotcG9pbnRlci10by1zaGFyZWQuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZnJlZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJmNjc5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2ZyZWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19mcmVlPC9jb2RlPiBmdW5jdGlvbiAgIDwvaDI+Ci08aDQ+U3lub3BzaXM8L2g0PgotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHZvaWQgdXBjX2ZyZWUoc2hhcmVkIHZvaWQgKnB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19mcmVlIDwvY29kZT4gICBmdW5jdGlvbiBmcmVlcyB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHNoYXJlZCBzdG9yYWdlIHBvaW50ZWQKLXRvIGJ5IDxjb2RlPnB0cjwvY29kZT4uIElmIDxjb2RlPnB0cjwvY29kZT4gaXMgYSBudWxsIHBvaW50ZXIsIG5vIGFjdGlvbiBvY2N1cnMuIE90aGVyd2lzZSwgaWYgdGhlCi1hcmd1bWVudCBkb2VzIG5vdCBtYXRjaCBhIHBvaW50ZXIgZWFybGllciByZXR1cm5lZCBieSB0aGUgCi08YSBocmVmPSJ1cGNfYWxsb2MuaHRtbCI+PGNvZGU+dXBjX2FsbG9jPC9jb2RlPjwvYT4sCi08YSBocmVmPSJ1cGNfZ2xvYmFsX2FsbG9jLmh0bWwiPjxjb2RlPnVwY19nbG9iYWxfYWxsb2M8L2NvZGU+PC9hPiwKLTxhIGhyZWY9InVwY19hbGxfYWxsb2MuaHRtbCI+PGNvZGU+dXBjX2FsbF9hbGxvYzwvY29kZT48L2E+LCBvciAKLTxhIGhyZWY9InVwY19sb2NhbF9hbGxvYy5odG1sIj48Y29kZT51cGNfbG9jYWxfYWxsb2M8L2NvZGU+PC9hPgotZnVuY3Rpb24sIG9yIGlmIHRoZQotc3BhY2UgaGFzIGJlZW4gZGVhbGxvY2F0ZWQgYnkgYSBwcmV2aW91cyBjYWxsLCBieSBhbnkgdGhyZWFkIAotKGkuZS4sIG9ubHkgb25lIHRocmVhZCBtYXkgY2FsbCA8Y29kZT51cGNfZnJlZSA8L2NvZGU+IGZvciBlYWNoIGFsbG9jYXRpb24pLAotdG8gPGNvZGU+dXBjX2ZyZWU8L2NvZGU+LAotdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19nbG9iYWxfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9hbGxvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzczNTI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9hbGxvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPGgyID51cGNfZ2xvYmFsX2FsbG9jPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotPHByZT4KLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgc2hhcmVkIHZvaWQgKnVwY19nbG9iYWxfYWxsb2Moc2l6ZV90IG5ibG9ja3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMpOwotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19nbG9iYWxfYWxsb2M8L2NvZGU+IGFsbG9jYXRlcyBzaGFyZWQgc3BhY2UgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWNsYXJhdGlvbjoKLTxwPgotPGNvZGU+Ci1zaGFyZWQgW25ieXRlc10gY2hhcltuYmxvY2tzICogbmJ5dGVzXTwvY29kZT4KLTxwPgotPGNvZGU+dXBjX2dsb2JhbF9hbGxvYzwvY29kZT4gZnVuY3Rpb24gaXMgbm90IGEgY29sbGVjdGl2ZSBmdW5jdGlvbi4gSWYgY2FsbGVkIGJ5Ci1tdWx0aXBsZSB0aHJlYWRzLCBhbGwgdGhyZWFkcyB3aGljaCBtYWtlIHRoZSBjYWxsIGdldCBkaWZmZXJlbnQgYWxsb2NhdGlvbnMuIElmCi08Y29kZT5uYmxvY2tzKm5ieXRlczwvY29kZT4gaXMgemVybywgdGhlIHJlc3VsdCBpcyBhIG51bGwgcG9pbnRlci10by1zaGFyZWQuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2V4aXQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9leGl0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmY5OTguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2V4aXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19nbG9iYWxfZXhpdDwvY29kZT4gZnVuY3Rpb24gPC9oMj4KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPgotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY19nbG9iYWxfZXhpdChpbnQgc3RhdHVzKTsKLTwvcHJlPgotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotPHA+Ci08Y29kZT51cGNfZ2xvYmFsX2V4aXQoKSA8L2NvZGU+Ci1mbHVzaGVzIGFsbCBJL08sIHJlbGVhc2VzIGFsbCBzdG9yYWdlLCBhbmQgdGVybWluYXRlcyB0aGUKLWV4ZWN1dGlvbiBmb3IgYWxsIGFjdGl2ZSB0aHJlYWRzLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2xvY2tfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2dsb2JhbF9sb2NrX2FsbG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTM1ZmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfZ2xvYmFsX2xvY2tfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19nbG9iYWxfbG9ja19hbGxvYzwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotCi08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgdXBjX2xvY2tfdCAqdXBjX2dsb2JhbF9sb2NrX2FsbG9jKHZvaWQpOyAgICAgICAgICAgICAgICAgICAgICAKLTwvcHJlPgotCi08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19nbG9iYWxfbG9ja19hbGxvYyA8L2NvZGU+ICAgZnVuY3Rpb24gZHluYW1pY2FsbHkgYWxsb2NhdGVzIGEgbG9jayBhbmQgcmV0dXJucwotYSBwb2ludGVyIHRvIGl0LiBUaGUgbG9jayBpcyBjcmVhdGVkIGluIGFuIHVubG9ja2VkIHN0YXRlLgotPHA+VGhlIDxjb2RlPnVwY19nbG9iYWxfbG9ja19hbGxvYyA8L2NvZGU+IGZ1bmN0aW9uIGlzIG5vdCBhIDxpPmNvbGxlY3RpdmU8L2k+IGZ1bmN0aW9uLiAgSWYgY2FsbGVkCi1ieSBtdWx0aXBsZSB0aHJlYWRzLCBhbGwgdGhyZWFkcyB3aGljaCBtYWtlIHRoZSBjYWxsIGdldCBkaWZmZXJlbnQgYWxsb2NhdGlvbnMuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9jYWxfYWxsb2MuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2FsX2FsbG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDdhMWEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9jYWxfYWxsb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19sb2NhbF9hbGxvYzwvY29kZT4gZnVuY3Rpb24gJm5ic3A7Jm5ic3A7IDxpPmRlcHJlY2F0ZWQ8L2k+IDwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cD4KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBzaGFyZWQgdm9pZCAqdXBjX2xvY2FsX2FsbG9jKHNpemVfdCBuYmxvY2tzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX2xvY2FsX2FsbG9jIDwvY29kZT4gZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBVUEMKLXByb2dyYW1zIHNob3VsZCB1c2UgdGhlIDxjb2RlPnVwY19hbGxvYyA8L2NvZGU+IGZ1bmN0aW9uIGluc3RlYWQuIFN1cHBvcnQgbWF5IGJlIHJlbW92ZWQKLWluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb24uCi08cD4KLVRoZSA8Y29kZT51cGNfbG9jYWxfYWxsb2MgPC9jb2RlPiBmdW5jdGlvbiBhbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIG9mIGF0IGxlYXN0IAotPGNvZGU+bmJsb2NrcyAqIG5ieXRlcyA8L2NvZGU+IGJ5dGVzIHdpdGggYWZmaW5pdHkgdG8gdGhlIGNhbGxpbmcgdGhyZWFkLiBJZiAKLTxjb2RlPm5ibG9ja3MgKiBuYnl0ZXMgPC9jb2RlPiAgaXMgemVybywKLXRoZSByZXN1bHQgaXMgYSBudWxsIHBvaW50ZXItdG8tc2hhcmVkLgotPHA+Ci08Y29kZT51cGNfbG9jYWxfYWxsb2MgPC9jb2RlPiBpcyBzaW1pbGFyIHRvIG1hbGxvYygpIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSBwb2ludGVyLXRvLXNoYXJlZAotdmFsdWUuIEl0IGlzIG5vdCBhIDxpPmNvbGxlY3RpdmU8L2k+IGZ1bmN0aW9uLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwOTE5ZS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19sb2NrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08aDIgPlRoZSA8Y29kZT51cGNfbG9jazwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY19sb2NrKHVwY19sb2NrX3QgKnB0cik7ICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbG9jazwvY29kZT4gICAgZnVuY3Rpb24gIHNldHMgdGhlIHN0YXRlIG9mIHRoZSBsb2NrIHBvaW50ZWQgdG8gYnkgPGNvZGU+cHRyPC9jb2RlPiB0byBsb2NrZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSBkdWUgdG8gdGhlIGNhbGxpbmcgdGhyZWFkIHNldHRpbmcgaXQgdG8KLWxvY2tlZCBzdGF0ZSwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSwgdGhlbiB0aGUgY2FsbGluZyB0aHJlYWQgd2FpdHMgZm9yIHNvbWUKLW90aGVyIHRocmVhZCB0byBzZXQgdGhlIHN0YXRlIHRvIHVubG9ja2VkLiAKLTxwPk9uY2UgdGhlIGxvY2sgaXMgaW4gc3RhdGUgdW5sb2NrZWQsIGEgc2luZ2xlIGNhbGxpbmcgdGhyZWFkIHNldHMgdGhlIHN0YXRlIHRvCi1sb2NrZWQgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zLgotPHA+QSBudWxsIHN0cmljdCBhY2Nlc3MgaXMgaW1wbGllZCBhZnRlciBhIGNhbGwgdG8gdXBjX2xvY2soKS4KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19sb2NrX2F0dGVtcHQuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfYXR0ZW1wdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkyYTliLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfYXR0ZW1wdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX2xvY2tfYXR0ZW1wdDwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICBpbnQgdXBjX2xvY2tfYXR0ZW1wdCh1cGNfbG9ja190ICpwdHIpOyAgICAgICAgICAgICAgIAotPC9wcmU+Ci0KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX2xvY2tfYXR0ZW1wdDwvY29kZT4gICAgZnVuY3Rpb24gIGF0dGVtcHRzIHRvIHNldCB0aGUgc3RhdGUgb2YgdGhlIGxvY2sgcG9pbnRlZAotdG8gYnkgPGNvZGU+cHRyPC9jb2RlPiB0byBsb2NrZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSBkdWUgdG8gdGhlIGNhbGxpbmcgdGhyZWFkIHNldHRpbmcgaXQgdG8KLWxvY2tlZCBzdGF0ZSwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi08cD5JZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIGxvY2tlZCBzdGF0ZSB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLgotPHA+SWYgdGhlIGxvY2sgaXMgaW4gc3RhdGUgdW5sb2NrZWQsIGEgc2luZ2xlIGNhbGxpbmcgdGhyZWFkIHNldHMgdGhlIHN0YXRlIHRvIGxvY2tlZAotYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuCi08cD5BIG51bGwgc3RyaWN0IGFjY2VzcyBpcyBpbXBsaWVkIGFmdGVyIGEgY2FsbCB0byB1cGNfbG9ja19hdHRlbXB0KCkgdGhhdCByZXR1cm5zCi0xLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfZnJlZS5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja19mcmVlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmQzZjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja19mcmVlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08aDIgPlRoZSA8Y29kZT51cGNfbG9ja19mcmVlPC9jb2RlPiBmdW5jdGlvbiAgIDwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cD4KLQotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHVwY19sb2NrX3QgKnVwY19sb2NrX2ZyZWUodXBjX2xvY2tfdCAqcHRyKTsgICAgICAgICAgICAgICAgICAgICAKLTwvcHJlPgotCi08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19sb2NrX2ZyZWU8L2NvZGU+ICAgIGZ1bmN0aW9uICBmcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHluYW1pY2FsbHkKLWFsbG9jYXRlZCA8Y29kZT51cGNfbG9ja190PC9jb2RlPiBwb2ludGVkIHRvIGJ5IDxjb2RlPnB0cjwvY29kZT4uIAotSWYgPGNvZGU+cHRyPC9jb2RlPiBpcyBhIG51bGwgcG9pbnRlciwgbm8KLWFjdGlvbiBvY2N1cnMuIAotT3RoZXJ3aXNlLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgbWF0Y2ggYSBwb2ludGVyIGVhcmxpZXIKLXJldHVybmVkIGJ5IHRoZSA8Y29kZT51cGNfZ2xvYmFsX2xvY2tfYWxsb2M8L2NvZGU+IG9yIAotPGNvZGU+dXBjX2FsbF9sb2NrX2FsbG9jPC9jb2RlPiBmdW5jdGlvbiwKLW9yIGlmIHRoZSBsb2NrIGhhcyBiZWVuIGRlYWxsb2NhdGVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byA8Y29kZT51cGNfbG9ja19mcmVlPC9jb2RlPiwKLXRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCi08cD4KLTxjb2RlPnVwY19sb2NrX2ZyZWU8L2NvZGU+IHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVmZXJlbmNlZCBsb2NrIGlzIGN1cnJlbnRseQotdW5sb2NrZWQgb3IgY3VycmVudGx5IGxvY2tlZCAoYnkgYW55IHRocmVhZCkuCi08cD5Bbnkgc3Vic2VxdWVudCBjYWxscyB0byBsb2NraW5nIGZ1bmN0aW9ucyBmcm9tIGFueSB0aHJlYWQgdXNpbmcgPGNvZGU+cHRyPC9jb2RlPiBoYXZlCi11bmRlZmluZWQgZWZmZWN0cy4gVGhpcyBhbHNvIGFwcGxpZXMgdG8gYW55IHRocmVhZCBjdXJyZW50bHkgY2FsbGluZyA8Y29kZT51cGNfbG9jazwvY29kZT4uCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX2xvY2tfdC5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja190Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWE1OTYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbG9ja190Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19sb2NrX3Q8L2NvZGU+IHR5cGU8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+VGhlIHR5cGUgZGVjbGFyZWQgaXMKLTxwcmU+ICAgCi0gICAgdXBjX2xvY2tfdCAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci08cD4KLVRoZSB0eXBlIDxjb2RlPnVwY19sb2NrX3QgPC9jb2RlPiAgaXMgYW4gb3BhcXVlIFVQQyB0eXBlLiA8Y29kZT51cGNfbG9ja190IDwvY29kZT4gaXMgYSBzaGFyZWQKLWRhdGF0eXBlIHdpdGggaW5jb21wbGV0ZSB0eXBlIChhcyBkZWZpbmVkIGluIFtJU08vSUVDMDAgU2VjIDYuMi41XSkuIAotT2JqZWN0cwotb2YgdHlwZSA8Y29kZT51cGNfbG9ja190IDwvY29kZT4gbWF5IHRoZXJlZm9yZSBvbmx5IGJlIG1hbmlwdWxhdGVkIHRocm91Z2ggcG9pbnRlcnMuCi1TdWNoIG9iamVjdHMgaGF2ZSB0d28gc3RhdGVzIGNhbGxlZCBsb2NrZWQgYW5kIHVubG9ja2VkLgotPHA+VHdvIHBvaW50ZXJzIHRvIHRoYXQgcmVmZXJlbmNlIHRoZSBzYW1lIGxvY2sgb2JqZWN0IHdpbGwgY29tcGFyZSBhcyBlcXVhbC4KLVRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHVwY19waGFzZW9mKCksIHVwY190aHJlYWRvZigpLCBhbmQgdXBjX2FkZHJmaWVsZCgpCi10byBzdWNoIHBvaW50ZXJzIGFyZSB1bmRlZmluZWQuCi0KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1jcHkuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX21lbWNweS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU0YWY2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX21lbWNweS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX21lbWNweTwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY19tZW1jcHkoc2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIAotICAgICAgICAgICAgICAgICAgICBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuKTsKLSAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbWVtY3B5PC9jb2RlPiAgICBmdW5jdGlvbiAgY29waWVzIG4gY2hhcmFjdGVycyBmcm9tIGEgc2hhcmVkIG9iamVjdCBoYXZpbmcKLWFmZmluaXR5IHdpdGggb25lIHRocmVhZCB0byBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggdGhlIHNhbWUgb3IKLWFub3RoZXIgdGhyZWFkLgotPHA+VGhlIDxjb2RlPnVwY19tZW1jcHk8L2NvZGU+IGZ1bmN0aW9uIHRyZWF0cyB0aGUgPGNvZGU+ZHN0PC9jb2RlPiBhbmQgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVycyBhcyBpZiAKLXRoZXkgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbXSBjaGFyW25dCi08L3ByZT4KLVRoZSBlZmZlY3QgaXMgZXF1aXZhbGVudCB0byBjb3B5aW5nIHRoZSBlbnRpcmUgY29udGVudHMgZnJvbSBvbmUgc2hhcmVkIGFycmF5Ci1vYmplY3Qgd2l0aCB0aGlzIHR5cGUgKHRoZSA8Y29kZT5zcmM8L2NvZGU+IGFycmF5KSB0byBhbm90aGVyIHNoYXJlZCBhcnJheSBvYmplY3Qgd2l0aAotdGhpcyB0eXBlICh0aGUgPGNvZGU+ZHN0PC9jb2RlPiBhcnJheSkuCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbWVtZ2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1nZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiYzQ0NC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1nZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19tZW1nZXQ8L2NvZGU+IGZ1bmN0aW9uICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotCi08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgdm9pZCB1cGNfbWVtZ2V0KHZvaWQgKiByZXN0cmljdCBkc3QsIAotICAgICAgICAgICAgICAgICAgICBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuKTsKLSAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbWVtZ2V0PC9jb2RlPiAgICBmdW5jdGlvbiAgY29waWVzIG4gY2hhcmFjdGVycyBmcm9tIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5Ci10byBhbnkgc2luZ2xlIHRocmVhZCB0byBhbiBvYmplY3Qgb24gdGhlIGNhbGxpbmcgdGhyZWFkLgotPHA+VGhlIDxjb2RlPnVwY19tZW1nZXQ8L2NvZGU+IGZ1bmN0aW9uIHRyZWF0cyB0aGUgPGNvZGU+c3JjPC9jb2RlPiBwb2ludGVyIGFzIGlmIGl0IGhhZCB0eXBlOgotPHByZT4KLSAgICBzaGFyZWQgW10gY2hhcltuXQotICAgIDwvcHJlPgotVGhlIGVmZmVjdCBpcyBlcXVpdmFsZW50IHRvIGNvcHlpbmcgdGhlIGVudGlyZSBjb250ZW50cyBmcm9tIG9uZSBzaGFyZWQgYXJyYXkKLW9iamVjdCB3aXRoIHRoaXMgdHlwZSAodGhlIDxjb2RlPnNyYzwvY29kZT4gYXJyYXkpIHRvIGFuIGFycmF5IG9iamVjdCAodGhlIDxjb2RlPmRzdDwvY29kZT4gYXJyYXkpCi1kZWNsYXJlZCB3aXRoIHRoZSB0eXBlCi08cHJlPgotICAgIGNoYXJbbl0KLTwvcHJlPgotCi0KLTxwPiZuYnNwCi08cD4mbmJzcAotPHA+PGEgaHJlZj0idGVybXMuaHRtbCI+VGVybXMsIGRlZmluaXRpb25zLCBhbmQgc3ltYm9sczwvYT48YnI+Ci08cD48YSBocmVmPSJpbmRleC5odG1sIj5CYWNrIHRvIGluZGV4IG9mIGFsbCBVUEMgZnVuY3Rpb25zPC9hPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfbWVtc2V0Lmh0bWwgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1zZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0ZDgyMC4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19tZW1zZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxoMiA+VGhlIDxjb2RlPnVwY19tZW1zZXQ8L2NvZGU+IGZ1bmN0aW9uICAgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotCi08cHJlPiAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgdm9pZCB1cGNfbWVtc2V0KHNoYXJlZCB2b2lkICpkc3QsIAotICAgICAgICAgICAgICAgICAgICBpbnQgYywgCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBuKTsKLSAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLQotPHA+Ci08aDQ+RGVzY3JpcHRpb248L2g0PgotCi08cD4KLVRoZSA8Y29kZT51cGNfbWVtc2V0PC9jb2RlPiAgICBmdW5jdGlvbiAgY29waWVzIHRoZSB2YWx1ZSBvZiBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQKLWNoYXIsIHRvIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5IHRvIGFueSBzaW5nbGUgdGhyZWFkLiBUaGUgbnVtYmVyIG9mCi1ieXRlcyBzZXQgaXMgbi4KLTxwPlRoZSA8Y29kZT51cGNfbWVtc2V0PC9jb2RlPiAgZnVuY3Rpb24gdHJlYXRzIHRoZSA8Y29kZT5kc3Q8L2NvZGU+IHBvaW50ZXIgYXMgaWYgaGFkIHR5cGU6Ci08cHJlPgotICAgIHNoYXJlZCBbXSBjaGFyW25dCi08L3ByZT4KLSAgICAKLVRoZSBlZmZlY3QgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBzaGFyZWQgYXJyYXkgb2JqZWN0Ci13aXRoIHRoaXMgdHlwZSAodGhlIDxjb2RlPmRzdDwvY29kZT4gYXJyYXkpIHRvIHRoZSB2YWx1ZSBjLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3BoYXNlb2YuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3BoYXNlb2YuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNGJmYS4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19waGFzZW9mLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19waGFzZW9mPC9jb2RlPiBmdW5jdGlvbjwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPiAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgc2l6ZV90IHVwY19waGFzZW9mKHNoYXJlZCB2b2lkICpwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX3BoYXNlb2YgPC9jb2RlPiBmdW5jdGlvbiAgcmV0dXJucyB0aGUgcGhhc2UgY29tcG9uZW50IG9mIHRoZSBwb2ludGVyLXRvLXNoYXJlZAotYXJndW1lbnQuCi08cD5JZiA8Y29kZT5wdHI8L2NvZGU+IGlzIGEgbnVsbCBwb2ludGVyLXRvLXNoYXJlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLQotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3Jlc2V0cGhhc2UuaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3Jlc2V0cGhhc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyNzgwMi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY19yZXNldHBoYXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08aDI+VGhlIDxjb2RlPnVwY19yZXNldHBoYXNlPC9jb2RlPiBmdW5jdGlvbjwvaDI+Ci0KLTxoND5TeW5vcHNpczwvaDQ+Ci08cHJlPiAgICAKLSAgICAjaW5jbHVkZSAmbHQ7dXBjLmgmZ3Q7Ci0gICAgc2hhcmVkIHZvaWQgKnVwY19yZXNldHBoYXNlKHNoYXJlZCB2b2lkICpwdHIpOyAgICAgICAgICAgICAgICAgICAgIAotPC9wcmU+Ci08cD4KLTxoND5EZXNjcmlwdGlvbjwvaDQ+Ci0KLTxwPgotVGhlIDxjb2RlPnVwY19yZXNldHBoYXNlIDwvY29kZT4gZnVuY3Rpb24gICByZXR1cm5zIGEgcG9pbnRlci10by1zaGFyZWQgd2hpY2ggaXMgaWRlbnRpY2FsCi10byBpdHMgaW5wdXQgZXhjZXB0IHRoYXQgaXQgaGFzIHplcm8gcGhhc2UuCi0KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY190aHJlYWRvZi5odG1sIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvaHRtbC91cGNfdGhyZWFkb2YuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiNDEwYi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY190aHJlYWRvZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX3RocmVhZG9mPC9jb2RlPiBmdW5jdGlvbiAmbmJzcDsmbmJzcDsgPC9oMj4KLQotPGg0PlN5bm9wc2lzPC9oND4KLTxwPgotPHByZT4gCi0gICAgI2luY2x1ZGUgJmx0O3VwYy5oJmd0OwotICAgIHNpemVfdCB1cGNfdGhyZWFkb2Yoc2hhcmVkIHZvaWQgKnB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgCi08L3ByZT4KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLTxwPgotVGhlIDxjb2RlPnVwY190aHJlYWRvZiA8L2NvZGU+ZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRocmVhZCB0aGF0IGhhcyBhZmZpbml0eQotdG8gdGhlIHNoYXJlZCBvYmplY3QgcG9pbnRlZCB0byBieSA8Y29kZT5wdHI8L2NvZGU+LgotPHA+Ci1JZiA8Y29kZT5wdHI8L2NvZGU+IGlzIGEgbnVsbCBwb2ludGVyLXRvLXNoYXJlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KLQotPHA+Jm5ic3AKLTxwPiZuYnNwCi08cD48YSBocmVmPSJ0ZXJtcy5odG1sIj5UZXJtcywgZGVmaW5pdGlvbnMsIGFuZCBzeW1ib2xzPC9hPjxicj4KLTxwPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gaW5kZXggb2YgYWxsIFVQQyBmdW5jdGlvbnM8L2E+CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9odG1sL3VwY191bmxvY2suaHRtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3VubG9jay5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTJkMGFiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2h0bWwvdXBjX3VubG9jay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPGgyID5UaGUgPGNvZGU+dXBjX3VubG9jazwvY29kZT4gZnVuY3Rpb24gICA8L2gyPgotCi08aDQ+U3lub3BzaXM8L2g0PgotPHA+Ci0KLTxwcmU+IAotICAgICNpbmNsdWRlICZsdDt1cGMuaCZndDsKLSAgICB2b2lkIHVwY191bmxvY2sodXBjX2xvY2tfdCAqcHRyKTsgICAgICAgICAgICAgIAotPC9wcmU+Ci0KLTxwPgotPGg0PkRlc2NyaXB0aW9uPC9oND4KLQotPHA+Ci1UaGUgPGNvZGU+dXBjX3VubG9jazwvY29kZT4gICAgZnVuY3Rpb24gIHNldHMgdGhlIHN0YXRlIG9mIHRoZSBsb2NrIHBvaW50ZWQgdG8gYnkgPGNvZGU+cHRyPC9jb2RlPiB0bwotdW5sb2NrZWQuCi08cD5Vbmxlc3MgdGhlIGxvY2sgaXMgaW4gbG9ja2VkIHN0YXRlIGFuZCB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIGxvY2tpbmcgdGhyZWFkLAotdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi08cD5BIG51bGwgc3RyaWN0IGFjY2VzcyBpcyBpbXBsaWVkIGJlZm9yZSBhIGNhbGwgdG8gdXBjIHVubG9jaygpLgotCi08cD4mbmJzcAotPHA+Jm5ic3AKLTxwPjxhIGhyZWY9InRlcm1zLmh0bWwiPlRlcm1zLCBkZWZpbml0aW9ucywgYW5kIHN5bWJvbHM8L2E+PGJyPgotPHA+PGEgaHJlZj0iaW5kZXguaHRtbCI+QmFjayB0byBpbmRleCBvZiBhbGwgVVBDIGZ1bmN0aW9uczwvYT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zLy5jdnNpZ25vcmUgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9pY29ucy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmYyZWI4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wc3BicndzZS5qYmYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zL3VwYy5naWYgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9pY29ucy91cGMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE4NzMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL2ljb25zL3VwYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9wbHVnaW4ucHJvcGVydGllcyBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjNmZGRkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wbHVnaW5OYW1lPVVQQyBzdXBwb3J0IGZvciBQTERUCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwotCi12aWV3Lm5hbWU9VVBDIEFydGlmYWN0IFZpZXcKLXZpZXdjYXQubmFtZT1QVFAgVVBDIFZpZXdzCi1ydW4ubGFiZWw9UnVuIFVQQyBBbmFseXNpcwotcnVuLnRvb2x0aXA9UnVuIFVQQyBBbmFseXNpcyBvbiBzZWxlY3RlZCBmaWxlLCBmb2xkZXIsIG9yIHByb2plY3QgdG8gZmluZCBVUEMgQXJ0aWZhY3RzCi0KLSNuZWVkIHRvIGFkZCBtb3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvcGx1Z2luLnhtbCBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZmY0NDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzLlVQQ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5wcmVmcGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24ucHJlZnMuUExEVFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iVVBDIi8+Ci0gICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tICBVUEMgbWFya2VycyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiCi0JCWlkPSJ1cGNNYXJrZXIiCi0gICAgICAgIG5hbWU9InVwYyBBcnRpZmFjdCBNYXJrZXIiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLSB0aGlzIGNoYW5nZXMgdGhlIG1hcmtlciBpbWFnZSBpbiB0aGUgZWRpdG9yIG1hcmtlciBiYXIgIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlCi0gICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudXBjTWFya2VyIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnVwY01hcmtlckFubm90YXRpb24iPgotICAgICAgPC90eXBlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5tYXJrZXJBbm5vdGF0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy51cGNNYXJrZXJBbm5vdGF0aW9uIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdXBjLmdpZiIgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSIzIgotICAgICAgICAgICAgbGFiZWw9InVwYyBBbm5vdGF0aW9uIE1hcmtlciIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9InVwY0luZGljYXRpb24iCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0iYXJ0aWZhY3RIaWdobGlnaHRpbmciCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIGNvbG9yUHJlZmVyZW5jZVZhbHVlPSIxMjgsMTI4LDE5MiIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotCQkJc2hvd0luTmV4dFByZXZEcm9wZG93blRvb2xiYXJBY3Rpb25LZXk9InNob3dQb3J0aW5nSW5OZXh0UHJldkRyb3Bkb3duVG9vbGJhckFjdGlvbiIKLSAgICAgICAgICAgIHNob3dJbk5leHRQcmV2RHJvcGRvd25Ub29sYmFyQWN0aW9uPSJmYWxzZSIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlS2V5PSJhcnRpZmFjdEluZGljYXRpb25Jbk92ZXJ2aWV3UnVsZXIiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0idHJ1ZSIKLSAgICAgICAgICAgIGlzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleT0iaXNQb3J0aW5nR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldCIKLQotICAgICAgICAgICAgaXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXk9ImlzUG9ydGluZ1JlY29yZEdvVG9OZXh0TmF2aWdhdGlvblRhcmdldCIKLSAgICAgICAgICAgID4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4gIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIldmlld2NhdC5uYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Lm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy91cGMuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudmlld3MuVVBDQXJ0aWZhY3RWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy52aWV3cy51cGNBcnRpZmFjdFZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LnVpLkNIZWxwUHJvdmlkZXIiPgotICAgICAgPHByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAuVVBDQ0hlbHBJbmZvUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHAuVVBDQ0hlbHBJbmZvUHJvdmlkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9ucy5SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmNvbW1hbmQyIgotICAgICAgICAgICAgbmFtZT0iZmluZCB1cGMgYXJ0aWZhY3RzIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24udG9vbGJhci5jb21tYW5kMSAiPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmNvbW1hbmQyIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvdXBjLmdpZiIKLSAgICAgICAgICAgICAgIGxhYmVsPSJTaG93IFVQQyBBcnRpZmFjdHMiPgotICAgICAgICAgPC9jb21tYW5kPgotICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGY1MDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5BcnRpZmFjdE1hcmtpbmdWaXNpdG9yOwotCi1wdWJsaWMgY2xhc3MgVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvciBleHRlbmRzIEFydGlmYWN0TWFya2luZ1Zpc2l0b3IKLXsKLSAgICBwdWJsaWMgVVBDQXJ0aWZhY3RNYXJraW5nVmlzaXRvcihTdHJpbmcgbWFya2VySWQpCi0gICAgewotICAgICAgICBzdXBlcihtYXJrZXJJZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENJRHMuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDSURzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzRlZTcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9VUENJRHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjOwotCi0vKioKLSAqIFVQQyBQbHVnaW4gY29uc3RhbnRzCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVQQ0lEcwotewotICAgIC8vIHByZWZlcmVuY2UgcGFnZSBuYW1lIGZvciBVUEMKLSAgICBTdHJpbmcgVVBDX0lOQ0xVREVTICAgID0gIlVQQyBJbmNsdWRlcyI7Ci0gICAgCi0gICAgU3RyaW5nIE1BUktFUl9JRCAgICAgICA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudXBjTWFya2VyIjsKLSAgICBTdHJpbmcgTUFSS0VSX0VSUk9SX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy51cGNFcnJvck1hcmtlciI7Ci0gICAgCi0gICAgLy8gYXJ0aWZhY3QgdmlldyBpZAotICAgIFN0cmluZyBVUENfVklFV19JRCA9ICJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMudmlld3MudXBjQXJ0aWZhY3RWaWV3IjsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDUGx1Z2luLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL1VQQ1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjY3ZjA3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvVVBDUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUENQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8qKiBUaGUgc2hhcmVkIGluc3RhbmNlLiAqLwotCXByaXZhdGUgc3RhdGljIFVQQ1BsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYyI7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVUENQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUENQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMiLCBwYXRoKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzZXR0aW5nIGZvciBVUEMgaW5jbHVkZSBwYXRocwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFVQQ0luY2x1ZGVEaXJzKCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdMaXN0ID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVVBDSURzLlVQQ19JTkNMVURFUyk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nTGlzdCwgRmlsZS5wYXRoU2VwYXJhdG9yICsgIlxuXHIiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkaXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgZGlycy5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXJzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpCi0gICAgewotICAgICAgICByZXR1cm4gUExVR0lOX0lEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYWN0aW9ucy9SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYWN0aW9ucy9SdW5BbmFseXNlVVBDY29tbWFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjOTM1Ni4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2FjdGlvbnMvUnVuQW5hbHlzZVVQQ2NvbW1hbmRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24uCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUVHJhbnNsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS51cGMuVVBDTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUxhbmd1YWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLlNjYW5SZXR1cm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmFjdGlvbnMuUnVuQW5hbHlzZUhhbmRsZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi51dGlsLlZpZXdBY3RpdmF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLlVQQ0FydGlmYWN0TWFya2luZ1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLlVQQ0lEczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5hbmFseXNpcy5VUENDQVNUVmlzaXRvcjsKLQotLyoqCi0gKiBUaGUgIkZpbmQgVVBDIEFydGlmYWN0cyIgYWN0aW9uL2NvbW1hbmQKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFuYWx5c2VVUENjb21tYW5kSGFuZGxlciBleHRlbmRzIFJ1bkFuYWx5c2VIYW5kbGVyQmFzZQotewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgIlJ1biBBbmFseXNpcyIgYWN0aW9uCi0JICovCi0JcHVibGljIFJ1bkFuYWx5c2VVUENjb21tYW5kSGFuZGxlcigpIHsKLQkJc3VwZXIoIlVQQyIsIG5ldyBVUENBcnRpZmFjdE1hcmtpbmdWaXNpdG9yKFVQQ0lEcy5NQVJLRVJfSUQpLCBVUENJRHMuTUFSS0VSX0lEKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgVVBDIGFuYWx5c2lzIGFydGlmYWN0cyBmb3IgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzCi0JICogICAgICAgICAgICBVUEMgaW5jbHVkZSBwYXRocwotCSAqIEByZXR1cm4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NhblJldHVybiBkb0FydGlmYWN0QW5hbHlzaXMoZmluYWwgSVRyYW5zbGF0aW9uVW5pdCB0dSwJZmluYWwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzKSB7Ci0JCWZpbmFsIFNjYW5SZXR1cm4gbXNyID0gbmV3IFNjYW5SZXR1cm4oKTsKLQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gdHUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJSUxhbmd1YWdlIGxhbmc7Ci0JCXRyeSB7Ci0JCQlsYW5nID0gdHUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgIAotCQkJSUFTVFRyYW5zbGF0aW9uVW5pdCBhdHUgPSB0dS5nZXRBU1QoKTsKLQkJCWlmIChsYW5nLmdldElkKCkuZXF1YWxzKFVQQ0xhbmd1YWdlLklEKSkgey8vIGNkdDQwCi0JCQkJYXR1LmFjY2VwdChuZXcgVVBDQ0FTVFZpc2l0b3IoaW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpKTsKLQkJCX0gCi0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBtc3I7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIGZpbGVuYW1lIGlzIHZhbGlkIGZvciBVUEMgYXJ0aWZhY3QgYW5hbHlzaXMKLQkgKiA8YnI+VE9ETyAgQ29uc2lkZXIgdXNpbmcgbGFuZ3VhZ2Ugb3IgY29udGVudC10eXBlIGluc3RlYWQgb2YgZmlsZSBleHRlbnNpb24/Ci0JICogUmUtdmlzaXQgYWZ0ZXIgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMSBpcyByZXNvbHZlZCAoVVBDICBjb250ZW50LXR5cGUgbm90IHJlY29nbml6ZWQpCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHBhcmFtIGlzQ1BQICBpcyB0aGUgcHJvamVjdCBhIEMrKyBwcm9qZWN0IG9yIG5vdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZEZvckFuYWx5c2lzKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBpc0NQUCkgewotCQlpbnQgbG9jID0gZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJaWYgKGxvYyA8PSAwKSAvLyBpZiBubyBkb3QsIG9yIGZpbGVuYW1lIGlzICIuZm9vIiwgbm90IHZhbGlkIGZvcgotCQkJCQkJLy8gYW5hbHlzaXMuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBleHQgPSBmaWxlbmFtZS5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCWV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWlmIChleHQuZXF1YWxzKCJ1cGMiKSkgCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlUGF0aCgpIHsKLQkJcmV0dXJuIFVQQ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VVBDSW5jbHVkZURpcnMoKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVBcnRpZmFjdFZpZXcoKSB7Ci0JCVZpZXdBY3RpdmF0ZXIuYWN0aXZhdGVWaWV3KFVQQ0lEcy5VUENfVklFV19JRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9hbmFseXNpcy9VUENDQVNUVmlzaXRvci5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9hbmFseXNpcy9VUENDQVNUVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWU3MmI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvYW5hbHlzaXMvVVBDQ0FTVFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmFuYWx5c2lzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RJZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTGl0ZXJhbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uU2NhblJldHVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uYW5hbHlzaXMuUGxkdEFzdFZpc2l0b3I7Ci0KLS8qKgotICogVGhpcyBkb20td2Fsa2VyIGNvbGxlY3RzICJhcnRpZmFjdHMiIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmljIGRvbWFpbiA8YnI+Ci0gKiAoZS5nLiBVUEMpLiBDdXJyZW50bHkgdGhlc2UgYXJ0aWZhY3RzIGluY2x1ZGUgZnVuY3Rpb24gY2FsbHMKLSAqIGFuZCBjb25zdGFudHMuIEl0IGFkZCBtYXJrZXJzIHRvIHRoZSBzb3VyY2UgZmlsZSBmb3IgQyBjb2RlLCBtYXJraW5nIHRoZQotICogcG9zaXRpb24gb2YgdGhlIGFydGlmYWN0cyBmb3VuZC4KLSAqIAotICogVGhpcyB2ZXJzaW9uIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgaW5zdGVhZCBvZiBkZWxlZ2F0aW5nIHRvPGJyPgotICogTXBpR2VuZXJhbEFTVFZpc2l0b3JCZWhhdmlvci4KLSAqCi0gKiBAYXV0aG9yIHRpYmJpdHRzCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVQQ0NBU1RWaXNpdG9yIGV4dGVuZHMgUGxkdEFzdFZpc2l0b3IgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWD0idXBjXyI7Ci0KLSAgICB7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRFeHByZXNzaW9ucyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRTdGF0ZW1lbnRzID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5zaG91bGRWaXNpdERlY2xhcmF0aW9ucyA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2hvdWxkVmlzaXRUcmFuc2xhdGlvblVuaXQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBVUENDQVNUVmlzaXRvcihMaXN0IHVwY0luY2x1ZGVzLCBTdHJpbmcgZmlsZU5hbWUsIFNjYW5SZXR1cm4gbXNyKQotICAgIHsKLSAgICAgICAgc3VwZXIodXBjSW5jbHVkZXMsIGZpbGVOYW1lLCBtc3IpOwotCQlBUlRJRkFDVF9DQUxMID0gIlVQQyBDYWxsIjsKLQkJQVJUSUZBQ1RfQ09OU1RBTlQ9IlVQQyBDb25zdGFudCI7Ci0gICAgfQotCi0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVEV4cHJlc3Npb24pCi0gICAgICovCi0gICAgcHVibGljIGludCB2aXNpdChJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJQVNURnVuY3Rpb25DYWxsRXhwcmVzc2lvbikgewotICAgICAgICAgICAgSUFTVEV4cHJlc3Npb24gYXN0RXhwciA9ICgoSUFTVEZ1bmN0aW9uQ2FsbEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldEZ1bmN0aW9uTmFtZUV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBhc3RFeHByLmdldFJhd1NpZ25hdHVyZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZ1bmMgc2lnbmF0dXJlPSIgKyBzaWduYXR1cmUpOwotICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5zdGFydHNXaXRoKFBSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXN0RXhwciBpbnN0YW5jZW9mIElBU1RJZEV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSUFTVE5hbWUgZnVuY05hbWUgPSAoKElBU1RJZEV4cHJlc3Npb24pIGFzdEV4cHIpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Z1bmNOYW1lKGZ1bmNOYW1lLCBhc3RFeHByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIElBU1RMaXRlcmFsRXhwcmVzc2lvbikgewotICAgICAgICAgICAgcHJvY2Vzc01hY3JvTGl0ZXJhbCgoSUFTVExpdGVyYWxFeHByZXNzaW9uKSBleHByZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwQm9vay5qYXZhIGIvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJhOTM3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvZWRpdG9ySGVscC9VUENDSGVscEJvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5lZGl0b3JIZWxwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC51aS5JRnVuY3Rpb25TdW1tYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LmNvbW1vbi5lZGl0b3JIZWxwLkNIZWxwQm9va0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLmVkaXRvckhlbHAuRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5GdW5jdGlvblN1bW1hcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci0KLS8qKgotICogVVBDIGhlbHAgYm9vayAtIHRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGhvdmVyIGhlbHAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgKGFuZCBGMS9keW5hbWljIGhlbHAgYXMgd2VsbCkgcmVxdWlyZXMgYSBmaXggdG8gQ0RUIHBvc3QtNS4wLjAgcmVsZWFzZQotICogdG8gb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuVHJhbnNsYXRpb25Vbml0ICAtIHRvIHJlY29nbml6ZSBjb250ZW50LXR5cGUgb2YgVVBDIHRvIGJlIGEgZGVyaXZpYXRpdmUgKCJraW5kT2YiKSB0aGUgQyBjb250ZW50IHR5cGUuCi0gKiA8cD5TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMSAgCi0gKiBAYXV0aG9yIEJldGggVGliYml0dHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUENDSGVscEJvb2sgZXh0ZW5kcyBDSGVscEJvb2tJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVVBDIEMgSGVscCBCb29rIjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsU3RyaW5nPiBkZXNjPW5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JCi0JcHVibGljIFVQQ0NIZWxwQm9vaygpIHsKLSAgICAgICAgc3VwZXIoVVBDUGx1Z2luLmdldFBsdWdpbklkKCkpOwotICAgICAgICAvLyBwb3B1bGF0ZSBkZXNjcmlwdGlvbiBtYXAgLSB0aGlzIGp1c3QgbWFrZXMgdGhlIGZ1bmNOYW1lMkZ1bmNJbmZvIGluaXQgbGluZXMgYSBiaXQgbW9yZSB0ZXJzZQotICAgICAgCi0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWRkcmZpZWxkIiwgIlJldHVybnMgYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB2YWx1ZSByZWZsZWN0aW5nIHRoZSA8cT5sb2NhbCBhZGRyZXNzPC9xPm9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci10by1zaGFyZWQgYXJndW1lbnQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWZmaW5pdHlzaXplIiwgIkEgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgbG9jYWwgcG9ydGlvbiBvZiB0aGUgZGF0YSBpbiBhIHNoYXJlZCBvYmplY3Qgd2l0aCBhZmZpbml0eSB0byA8Y29kZT50aHJlYWRpZDwvY29kZT4uIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2FsbG9jIiwgIkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxfYnJvYWRjYXN0IiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSB3aXRoIGFmZmluaXR5IHRvIGEgc2luZ2xlIHRocmVhZCB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgb24gZWFjaCB0aHJlYWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2xvY2tfYWxsb2MiLCAiRHluYW1pY2FsbHkgYWxsb2NhdGVzIGEgbG9jayBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuIFRoZSBsb2NrIGlzIGNyZWF0ZWQgaW4gYW4gdW5sb2NrZWQgc3RhdGUuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfYWxsX2V4Y2hhbmdlIiwgIkNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBqIHRvIHRoZSBqdGggYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBoYXMgYWZmaW5pdHkgdG8gdGhyZWFkIGkiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxfZ2F0aGVyIiwgICAgICJDb3BpZXMgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIHRoZSBpdGggYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IGFyZWEgdGhhdCBoYXMgYWZmaW5pdHkgdG8gYSBzaW5nbGUgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9nYXRoZXJfYWxsIiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIG9uZSBzaGFyZWQgbWVtb3J5IGFyZWEgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZCB0byB0aGUgaXRoIGJsb2NrIG9mIGEgc2hhcmVkIG1lbW9yeSBhcmVhIG9uIGVhY2ggdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9sb2NrX2FsbG9jIiwgIkR5bmFtaWNhbGx5IGFsbG9jYXRlcyBhIGxvY2sgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGl0LiBUaGUgbG9jayBpcyBjcmVhdGVkIGluIGFuIHVubG9ja2VkIHN0YXRlLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9wZXJtdXRlIiwgIkNvcGllcyBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIGEgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgaGFzIGFmZmluaXR5IHRvIHRoZSBpdGggdGhyZWFkIHRvIGEgYmxvY2sgb2YgYSBzaGFyZWQgbWVtb3J5IHRoYXQgaGFzIGFmZmluaXR5IHRvIHRocmVhZCBwZXJtW2ldLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2FsbF9zY2F0dGVyIiwgIkNvcGllcyB0aGUgaXRoIGJsb2NrIG9mIGFuIGFyZWEgb2Ygc2hhcmVkIG1lbW9yeSB3aXRoIGFmZmluaXR5IHRvIGEgc2luZ2xlIHRocmVhZCB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgd2l0aCBhZmZpbml0eSB0byB0aGUgaXRoIHRocmVhZC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19hbGxvYyIsICJBbGxvY2F0ZXMgc2hhcmVkIHNwYWNlIG9mIGF0IGxlYXN0IG5ieXRlcyB3aXRoIGFmZmluaXR5IHRvIHRoZSBjYWxsaW5nIHRocmVhZC4iKTsgICAgICAKLSAgICAgICAgZGVzYy5wdXQoInVwY19mcmVlIiwgIkZyZWVzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzaGFyZWQgc3RvcmFnZSIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2dsb2JhbF9hbGxvYyIsIkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UiKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19nbG9iYWxfZXhpdCIsIkZsdXNoZXMgYWxsIEkvTywgcmVsZWFzZXMgYWxsIHN0b3JhZ2UsIGFuZCB0ZXJtaW5hdGVzIHRoZSBleGVjdXRpb24gZm9yIGFsbCBhY3RpdmUgdGhyZWFkcy4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19nbG9iYWxfbG9ja19hbGxvYyIsICJEeW5hbWljYWxseSBhbGxvY2F0ZXMgYSBsb2NrIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdC4gVGhlIGxvY2sgaXMgY3JlYXRlZCBpbiBhbiB1bmxvY2tlZCBzdGF0ZS4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19sb2NhbF9hbGxvYyIsIkRlcHJlY2F0ZWQuIFVzZSB1cGNfYWxsb2MgaW5zdGVhZC5cbkFsbG9jYXRlcyBzaGFyZWQgc3BhY2UuIik7ICAgICAgCi0gICAgICAgIGRlc2MucHV0KCJ1cGNfbG9ja19hdHRlbXB0IiwgIkF0dGVtcHRzIHRvIHNldCB0aGUgc3RhdGUgb2YgYSBsb2NrIHRvIGxvY2tlZC4gUmV0dXJuIGNvZGUgaW5kaWNhdGVzIHByZXZpb3VzIHN0YXRlLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX2xvY2tfZnJlZSIsICJGcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2suIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbG9ja190IiwgIlVQQyB0eXBlIGZvciBhIGxvY2siKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19sb2NrIiwgIlNldHMgdGhlIHN0YXRlIG9mIGEgbG9jayB0byBsb2NrZWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbWVtY3B5IiwgIkNvcGllcyBuIGNoYXJhY3RlcnMgZnJvbSBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggb25lIHRocmVhZCB0byBhIHNoYXJlZCBvYmplY3QgaGF2aW5nIGFmZmluaXR5IHdpdGggdGhlIHNhbWUgb3IgYW5vdGhlciB0aHJlYWQuIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfbWVtZ2V0IiwgIkNvcGllcyBuIGNoYXJhY3RlcnMgZnJvbSBhIHNoYXJlZCBvYmplY3Qgd2l0aCBhZmZpbml0eSB0byBhbnkgc2luZ2xlIHRocmVhZCB0byBhbiBvYmplY3Qgb24gdGhlIGNhbGxpbmcgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX21lbXNldCIsICJDb3BpZXMgYSB2YWx1ZSwgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIHRvIGEgc2hhcmVkIG9iamVjdCB3aXRoIGFmZmluaXR5IHRvIGFueSBzaW5nbGUgdGhyZWFkLiIpOwotICAgICAgICBkZXNjLnB1dCgidXBjX3BoYXNlb2YiLCAiUmV0dXJucyB0aGUgcGhhc2UgY29tcG9uZW50IG9mIHRoZSBwb2ludGVyLXRvLXNoYXJlZCBhcmd1bWVudC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY19yZXNldHBoYXNlIiwgIlJldHVybnMgYSBwb2ludGVyLXRvLXNoYXJlZCB3aGljaCBpcyBpZGVudGljYWwgdG8gaXRzIGlucHV0IGV4Y2VwdCB0aGF0IGl0IGhhcyB6ZXJvIHBoYXNlIik7Ci0gICAgICAgIGRlc2MucHV0KCJ1cGNfdGhyZWFkb2YiLCAiUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRocmVhZCB0aGF0IGhhcyBhZmZpbml0eSB0byB0aGUgc2hhcmVkIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBhcmd1bWVudC4iKTsKLSAgICAgICAgZGVzYy5wdXQoInVwY191bmxvY2siLCAiU2V0cyB0aGUgc3RhdGUgb2YgYSBsb2NrIHRvIHVubG9ja2VkLiIpOyAKLSAgICAgICAgZGVzYy5wdXQoInNoYXJlZCIsICJ0aGlzIGlzIGEgc2hhcmVkIFVQQyBrZXl3b3JkIik7Ci0gICAgICAgIAotICAgICAgICAKLQkJLy8gcG9wdWxhdGUgZnVuYyBtYXAKLSAgICAgICAgLy9mdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19mcmVlIiwgbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwoInVwY19mcmVlIiwgIiIsICJ1cGNfZnJlZSB0ZXN0IGRlc2NyaXB0aW9uIiwKLSAgICAgICAgLy8gICAgICAgIG5ldyBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnlJbXBsKCJ1cGNfZnJlZSIsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSwgbnVsbCkpOwotICAgICAgICBTdHJpbmcgZGVzYyA9ICIiOyAvLyB3aWxsIGRvIG1hcCBsb29rdXAgZm9yIGRlc2NyaXB0aW9uIGluIGZwcyBtZXRob2QuCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FkZHJmaWVsZCIsIGZwcygidXBjX2FkZHJmaWVsZCIsICIiLCBkZXNjLCAic2l6ZV90IiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FmZmluaXR5c2l6ZSIsIGZwcygidXBjX2FmZmluaXR5c2l6ZSIsICIiLCBkZXNjLCAic2l6ZV90IiwgInNpemVfdCB0b3RhbHNpemUsIHNpemVfdCBuYnl0ZXMsIHNpemVfdCB0aHJlYWRpZCIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfYWxsX2FsbG9jIiwgZnBzKCJ1cGNfYWxsX2FsbG9jIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNpemVfdCBuYmxvY2tzLCBzaXplX3QgbmJ5dGVzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfYnJvYWRjYXN0IiwgZnBzKCJ1cGNfYWxsX2Jyb2FkY2FzdCIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9leGNoYW5nZSIsIGZwcygidXBjX2FsbF9leGNoYW5nZSIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9nYXRoZXJfYWxsIiwgZnBzKCJ1cGNfYWxsX2dhdGhlcl9hbGwiLCAiIiwgZGVzYywgInZvaWQiLCAic2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIHNoYXJlZCBjb25zdCB2b2lkICogcmVzdHJpY3Qgc3JjLCBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfZ2F0aGVyIiwgZnBzKCJ1cGNfYWxsX2dhdGhlciIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqIHJlc3RyaWN0IGRzdCwgc2hhcmVkIGNvbnN0IHZvaWQgKiByZXN0cmljdCBzcmMsIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7ICAgICAgCQkKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfYWxsX2xvY2tfYWxsb2MiLCBmcHMoInVwY19hbGxfbG9ja19hbGxvYyIsICIiLCBkZXNjLCAidXBjX2xvY2tfdCIsICJ2b2lkIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxfcGVybXV0ZSIsIGZwcygidXBjX2FsbF9wZXJtdXRlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2hhcmVkIGNvbnN0IGludCAqIHJlc3RyaWN0IHBlcm0sIHNpemVfdCBuYnl0ZXMsIHVwY19mbGFnX3QgZmxhZ3MiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2FsbF9zY2F0dGVyIiwgZnBzKCJ1cGNfYWxsX3NjYXR0ZXIiLCAiIiwgZGVzYywgInZvaWQiLCAic2hhcmVkIHZvaWQgKiByZXN0cmljdCBkc3QsIHNoYXJlZCBjb25zdCB2b2lkICogcmVzdHJpY3Qgc3JjLCBzaXplX3QgbmJ5dGVzLCB1cGNfZmxhZ190IGZsYWdzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19hbGxvYyIsIGZwcygidXBjX2FsbG9jIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNpemVfdCBuYnl0ZXMiKSk7ICAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2ZyZWUiLCBmcHMoInVwY19mcmVlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2dsb2JhbF9hbGxvYyIsIGZwcygidXBjX2dsb2JhbF9hbGxvYyIsICIiLCBkZXNjLCAidm9pZCIsICJpbnQgc3RhdHVzIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY19nbG9iYWxfZXhpdCIsIGZwcygidXBjX2dsb2JhbF9leGl0IiwgIiIsIGRlc2MsICJ2b2lkIiwgImludCBzdGF0dXMiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2dsb2JhbF9sb2NrX2FsbG9jIiwgZnBzKCJ1cGNfZ2xvYmFsX2xvY2tfYWxsb2MiLCAiIiwgZGVzYywgInVwY19sb2NrX3QiLCAidm9pZCIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbG9jYWxfYWxsb2MiLCBmcHMoInVwY19sb2NhbF9hbGxvYyIsICIiLCBkZXNjLCAidm9pZCIsICJzaXplX3QgbmJsb2Nrcywgc2l6ZV90IG5ieXRlcyIpKTsgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2xvY2tfYXR0ZW1wdCIsIGZwcygidXBjX2xvY2tfYXR0ZW1wdCIsICIiLCBkZXNjLCAiaW50IiwgInVwY19sb2NrX3QgKnB0ciIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbG9ja19mcmVlIiwgZnBzKCJ1cGNfbG9ja19mcmVlIiwgIiIsIGRlc2MsICJ1cGNfbG9ja190IiwgInZvaWQiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX2xvY2siLCBmcHMoInVwY19sb2NrIiwgIiIsIGRlc2MsICJ2b2lkIiwgInVwY19sb2NrX3QgKnB0ciIpKTsKLSAgICAgICAgZnVuY05hbWUyRnVuY0luZm8ucHV0KCJ1cGNfbWVtY3B5IiwgZnBzKCJ1cGNfbWVtY3B5IiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG4iKSk7ICAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX21lbWdldCIsIGZwcygidXBjX21lbWdldCIsICIiLCBkZXNjLCAidm9pZCIsICJ2b2lkICogcmVzdHJpY3QgZHN0LCBzaGFyZWQgY29uc3Qgdm9pZCAqIHJlc3RyaWN0IHNyYywgc2l6ZV90IG4iKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX21lbXNldCIsIGZwcygidXBjX21lbXNldCIsICIiLCBkZXNjLCAidm9pZCIsICJzaGFyZWQgdm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IG4iKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3BoYXNlb2YiLCBmcHMoInVwY19tZW1zZXQiLCAiIiwgZGVzYywgInNpemVfdCIsICJzaGFyZWQgdm9pZCAqcHRyIikpOyAgICAgCi0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3Jlc2V0cGhhc2UiLCBmcHMoInVwY19yZXNldHBoYXNlIiwgIiIsIGRlc2MsICJ2b2lkIiwgInNoYXJlZCB2b2lkICpwdHIiKSk7Ci0gICAgICAgIGZ1bmNOYW1lMkZ1bmNJbmZvLnB1dCgidXBjX3RocmVhZG9mIiwgZnBzKCJ1cGNfdGhyZWFkb2YiLCAiIiwgZGVzYywgInNpemVfdCIsICJzaGFyZWQgdm9pZCAqcHRyIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInVwY191bmxvY2siLCBmcHMoInVwY191bmxvY2siLCAiIiwgZGVzYywgInZvaWQiLCAidXBjX2xvY2tfdCAqcHRyIikpOwotICAgICAgICBmdW5jTmFtZTJGdW5jSW5mby5wdXQoInNoYXJlZCIsIGZwcygic2hhcmVkIiwgIiIsIGRlc2MsICIiLCAiIikpOwotICAgICAgICAKLSAgICAgICAgLy8gc2V0IHRpdGxlCi0gICAgICAgIHNldFRpdGxlKFRJVExFKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGlucHV0dGluZyB0aGVzZSBGdW5jdGlvblByb3RvdHlwZVN1bW1hcnkgYW5kIEZ1bmN0aW9uU3VtbWFyeSBhcmd1bWVudHMuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gbmFtZXNwYWNlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIGlmIGVtcHR5IHdpbGwgZG8gbG9va3VwIGluIE1hcAotCSAqIEBwYXJhbSByZXR1cm5UeXBlCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElGdW5jdGlvblN1bW1hcnkgZnBzKFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyByZXR1cm5UeXBlLCBTdHJpbmcgYXJncyl7Ci0JCWlmKGRlc2NyaXB0aW9uPT1udWxsIHx8IGRlc2NyaXB0aW9uLmxlbmd0aCgpPT0wKSB7Ci0JCQlkZXNjcmlwdGlvbj1nZXREZXNjKG5hbWUpOwotCQl9Ci0JCUlGdW5jdGlvblN1bW1hcnkgZnBzID0gbmV3IEZ1bmN0aW9uU3VtbWFyeUltcGwobmFtZSwgbmFtZXNwYWNlLCBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb25Qcm90b3R5cGVTdW1tYXJ5SW1wbChuYW1lLCByZXR1cm5UeXBlLCBhcmdzKSwgbnVsbCk7Ci0JCXJldHVybiBmcHM7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzYyhTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpZGVzYy5nZXQoa2V5KTsKLQkJaWYoZGVzY3JpcHRpb249PW51bGwpCi0JCQlkZXNjcmlwdGlvbj1rZXkrIiBkZXNjcmlwdGlvbiI7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzMzMQotCSAqICgiQ0hlbHBQcm92aWRlciBub3QgY2FsbGVkIGZvciBVUEMiKQotCSAqIHNvIHRoYXQgVVBDIGhlbHAgd2lsbCBnZXQgY2FsbGVkLgotCSAqIENEVCBidWcgZml4IHJlcXVpcmVkIGZvciB0aGlzIHRvIHdvcmsgb3RoZXJ3aXNlLgotCSAqIEZvciBleGFtcGxlLCBpbiBUcmFuc2xhdGlvblVuaXQgdG8gbWFrZSB0aGUgVVBDIHR5cGUgJ2luaGVyaXQnIGZyb20gdGhlIEMgdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGlzIHJldHVybnMgYW4gaW52YWxpZCBudW1iZXIgYXMgYSB3b3JrYXJvdW5kLgotCSAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGVmYXVsdCBwYXJ0IG9mIHRoZSBzd2l0Y2ggaW4gQ0hlbHBCb29rRGVzY3JpcHRvci5tYXRjaGVzKCkKLQkgKiB0byBleGVjdXRlIGFuZCB0aGUgVVBDIGhlbHAgd2lsbAotCSAqIG1hdGNoIGZvciBhbGwgZmlsZXMuIE5vdCBwcmV0dHkgYnV0IGl0IHdpbGwgd29yayBmb3Igbm93LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY2R0LmludGVybmFsLmNvcmUubW9kZWwuVHJhbnNsYXRpb25Vbml0Ci0JICogCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikvLyBqdXN0IGZvciB0aGUgamF2YWRvYyBjb21tZW50IHRvIG5vdCBnZXQgd2FybmluZyA6KQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0Q0hlbHBUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9lZGl0b3JIZWxwL1VQQ0NIZWxwSW5mb1Byb3ZpZGVyLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2VkaXRvckhlbHAvVVBDQ0hlbHBJbmZvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2OGIzNi4uMDAwMDAwMAotLS0gYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL2VkaXRvckhlbHAvVVBDQ0hlbHBJbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLmVkaXRvckhlbHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24uZWRpdG9ySGVscC5DSGVscFByb3ZpZGVySW1wbDsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBJQ0hlbHBQcm92aWRlciBhbmQgcHJvdmlkZXMgVVBDIGluZm9ybWF0aW9uIDxicj4KLSAqIChGMSwgaG92ZXIsIGNvbnRlbnQgYXNzaXN0LCBldGMuKQotICAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgIHJlcXVpcmVzIGEgZml4IHRvIENEVCBwb3N0LTUuMC4wIHJlbGVhc2UKLSAqIHRvIG9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC5jb3JlLm1vZGVsLlRyYW5zbGF0aW9uVW5pdCAgLSB0byByZWNvZ25pemUgY29udGVudC10eXBlIG9mIFVQQyB0byBiZSBhIGRlcml2aWF0aXZlICgia2luZE9mIikgdGhlIEMgY29udGVudCB0eXBlLgotICogPHA+U2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzczMzEgIAotICogPHA+RnVydGhlciBub3RlOiBhIHdvcmthcm91bmQgaGFzIGJlZW4gYXBwbGllZCBpbiBVQ0NDSGVscEJvb2sgdG8gbm90IHJlcXVpcmUgdGhlIENEVCBwYXRjaAotICogCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cwotICoKLSAqLwotcHVibGljIGNsYXNzIFVQQ0NIZWxwSW5mb1Byb3ZpZGVyIGV4dGVuZHMgQ0hlbHBQcm92aWRlckltcGwgewotCi0JcHVibGljIFVQQ0NIZWxwSW5mb1Byb3ZpZGVyKCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVVBDQ0hlbHBJbmZvUHJvdmlkZXIgY3RvcigpLi4uIik7Ly9kZWJ1ZyBvbmx5ICwgdG8gc2VlIHdoZW4gY2FsbGVkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaGVscEJvb2sgPSBuZXcgVVBDQ0hlbHBCb29rKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJVUENDSGVscEluZm9Qcm92aWRlciBpbml0aWFsaXplKCkuLi4iKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL3ByZWZzL1VQQ1ByZWZlcmVuY2VQYWdlLmphdmEgYi90b29scy9wbGR0L29yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvdXBjL3ByZWZzL1VQQ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDQ5YjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy9wcmVmcy9VUENQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnByZWZzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QYXRoRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgYmFzZWQgb24gRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotICogCi0gKiBAYXV0aG9yIHh1ZQotICovCi0KLXB1YmxpYyBjbGFzcyBVUENQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCAgPSAiVVBDIGluY2x1ZGUgcGF0aHM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVNfUFJFRkVSRU5DRV9CUk9XU0UgPSAiUGxlYXNlIGNob29zZSBhIGRpcmVjdG9yeToiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUD0iTG9jYXRpb24gb2YgVVBDIGhlbHAgZmlsZXM6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfREVGQVVMVD0iVXNlIGRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUF9ERUZBVUxUX0lEPSJ1cGNIZWxwVXNlRGVmYXVsdCI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfTElOVVg9IlVzZSBMaW51eCBsb2NhdGlvbjogIjsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfSEVMUF9BSVg9IlVzZSBBSVggbG9jYXRpb246ICI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfT1RIRVI9Ik90aGVyOiI7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0hFTFBfT1RIRVJfSUQ9InVwY0hlbHBPdGhlciI7Ci0gICAgCi0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBDX0xPQ0FUSU9OX0FJWD0iL29wdC9yc2N0L2xhcGkvZWNsaXBzZS9oZWxwIjsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfTE9DQVRJT05fTElOVVg9Im9wdC9pYm1ocGMvbGFwaS9lY2xpcHNlL2hlbHAiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUENfV0hJQ0hfSEVMUF9JRD0iZGVmYXVsdCI7ICAvLyBhbHRlcm5hdGl2ZXMgYXJlOiBkZWZhdWx0LCBhaXgsIGxpbnV4LCBvdGhlcgotCi0gICAgcHVibGljIFVQQ1ByZWZlcmVuY2VQYWdlKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKEZMQVQpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFVQQ1ByZWZlcmVuY2VQYWdlKGludCBzdHlsZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKHN0eWxlKTsKLSAgICAgICAgaW5pdFByZWZlcmVuY2VTdG9yZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUENQcmVmZXJlbmNlUGFnZShTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciBpbWFnZSwgaW50IHN0eWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIodGl0bGUsIGltYWdlLCBzdHlsZSk7Ci0gICAgICAgIGluaXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVBDUHJlZmVyZW5jZVBhZ2UoU3RyaW5nIHRpdGxlLCBpbnQgc3R5bGUpCi0gICAgewotICAgICAgICBzdXBlcih0aXRsZSwgc3R5bGUpOwotICAgICAgICBpbml0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdCBwcmVmZXJlbmNlIHN0b3JlIGFuZCBzZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFByZWZlcmVuY2VTdG9yZSgpCi0gICAgewotICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gVVBDUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKQotICAgIHsKLSAgICAgICAgUGF0aEVkaXRvciBwYXRoRWRpdG9yID0gbmV3IFBhdGhFZGl0b3IoVVBDSURzLlVQQ19JTkNMVURFUywgSU5DTFVERVNfUFJFRkVSRU5DRV9MQUJFTCwKLSAgICAgICAgICAgICAgICBJTkNMVURFU19QUkVGRVJFTkNFX0JST1dTRSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgICAgIGFkZEZpZWxkKHBhdGhFZGl0b3IpOwotCi0gICAgICAgIC8vIlVzZSBkZWZhdWx0PyIKLS8vICAgICAgICBCb29sZWFuRmllbGRFZGl0b3IgYmVkID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcihVUENfSEVMUF9ERUZBVUxUX0lELFVQQ19IRUxQX0RFRkFVTFQsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0vLyAgICAgICAgYWRkRmllbGQoYmVkKTsKLSAgLyogICAgICAKLSAgICAgICAgaW50IG51bUNvbD0xOwotICAgIAlSYWRpb0dyb3VwRmllbGRFZGl0b3IgY2hvaWNlRkUgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFVQQ19XSElDSF9IRUxQX0lELCBVUENfSEVMUCwgbnVtQ29sLCBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJeyBVUENfSEVMUF9ERUZBVUxULCAiY2hvaWNlMSIgfSwgCi0JCQkJeyBVUENfSEVMUF9BSVgrVVBDX0xPQ0FUSU9OX0FJWCwgImNob2ljZTIiIH0sIAotCQkJCXsgVVBDX0hFTFBfTElOVVgrVVBDX0xPQ0FUSU9OX0xJTlVYLCAiQ2hvaWNlMyIgfSwKLQkJCQl7IFVQQ19IRUxQX09USEVSLCAiQ2hvaWNlNCIgfX0sCi0JCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgCWFkZEZpZWxkKGNob2ljZUZFKTsKLSAgICAJCi0gICAgCVN0cmluZ0ZpZWxkRWRpdG9yIG90aGVyTG9jPW5ldyBTdHJpbmdGaWVsZEVkaXRvcihVUENfSEVMUF9PVEhFUl9JRCwgVVBDX0hFTFBfT1RIRVIsZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0gICAgCWFkZEZpZWxkKG90aGVyTG9jKTsKLSAgICAJKi8KLSAgICAJCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy92aWV3cy9VUENBcnRpZmFjdFZpZXcuamF2YSBiL3Rvb2xzL3BsZHQvb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC91cGMvdmlld3MvVVBDQXJ0aWZhY3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzI4ZDUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGxkdC9vcmcuZWNsaXBzZS5wdHAucGxkdC51cGMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3VwYy92aWV3cy9VUENBcnRpZmFjdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQudXBjLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQuY29tbW9uLnZpZXdzLlNpbXBsZVRhYmxlTWFya2VyVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC51cGMuVVBDSURzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnVwYy5VUENQbHVnaW47Ci0KLQotCi0vKioKLSAqIEEgVVBDIGFydGlmYWN0IHZpZXcgYmFzZWQgb24gU2ltcGxlVGFibGVWaWV3IDxicj4KLSAqIE5vdGUgdGhhdCB0aGUgSUQgbXVzdCBiZSB1bmlxdWUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVQQ0FydGlmYWN0VmlldyBleHRlbmRzIFNpbXBsZVRhYmxlTWFya2VyVmlldwotewotICAgIHB1YmxpYyBVUENBcnRpZmFjdFZpZXcoKQotICAgIHsKLSAgICAgICAgLy8gaWYgeW91IG5lZWQgdG8gcmVhZCBpY29uIGltYWdlcywgZXRjLiBmcm9tIHRoZSBwbHVnLWluLCBiZSBzdXJlIHRvIHBhc3MKLSAgICAgICAgLy8gaW4gYW4gYWN0dWFsIFBsdWdpbiBjbGFzcyBpbnN0YW5jZSBmb3IgZmlyc3QgYXJnCi0gICAgICAgIHN1cGVyKFVQQ1BsdWdpbi5nZXREZWZhdWx0KCksICJVUEMgQXJ0aWZhY3QiLCAiVVBDIEFydGlmYWN0cyIsICJDb25zdHJ1Y3QiLCBVUENJRHMuTUFSS0VSX0lEKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLy5jbGFzc3BhdGggYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy8ucHJvamVjdCBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmY2NzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg0YWI3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBTYW1wbGUgQ0RUIFN0YXRpYyBBbmFseXNpcwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5wdHAucGxkdC5jb21tb24sCi0gb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLAotIG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiBJQk0gUmVzZWFyY2gKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvYnVpbGQucHJvcGVydGllcyBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZDNhNy4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9jYWxscy5naWYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1ZTVhNS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvY2FsbHNDLmdpZiBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvY2FsbHNDLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5ZmEyNS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzQy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzQ0YuZ2lmIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9jYWxsc0NGLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzM2IxOS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NhbGxzQ0YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9jbGFzc19oaS5naWYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NsYXNzX2hpLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmOTI3ZS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2NsYXNzX2hpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvZ3JhcGhDLmdpZiBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvZ3JhcGhDLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1YzMzOC4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2dyYXBoQy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2dyYXBoVy5naWYgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2ljb25zL2dyYXBoVy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjI5NGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9ncmFwaFcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9zYW1wbGUuZ2lmIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvaWNvbnMvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvcGx1Z2luLnhtbCBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhNmU3NS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iU2FtcGxlIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9ImNkdEFTVDIuY29tbWFuZHMuY2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJDYWxsR3JhcGggQ29tbWFuZCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9ImNkdEFTVDIuY29tbWFuZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0iY2R0QVNUMi5jb21tYW5kcy5jZ0NvbW1hbmQiPgotICAgICAgPC9jb21tYW5kPgotICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICBuYW1lPSJDRkcgQ29tbWFuZCIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9ImNkdEFTVDIuY29tbWFuZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0iY2R0QVNUMi5jb21tYW5kcy5jZmdDb21tYW5kIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLSAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICBjb21tYW5kSWQ9ImNkdEFTVDIuY29tbWFuZHMuY2dDb21tYW5kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzLmhhbmRsZXJzLkJ1aWxkQ2FsbEdyYXBoSGFuZGxlciI+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICAgICA8aGFuZGxlcgotICAgICAgICAgICAgY29tbWFuZElkPSJjZHRBU1QyLmNvbW1hbmRzLmNmZ0NvbW1hbmQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMuaGFuZGxlcnMuQnVpbGRDRkdyYXBoSGFuZGxlciI+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0gICAgICA8a2V5Ci0gICAgICAgICAgICBjb21tYW5kSWQ9ImNkdEFTVDIuY29tbWFuZHMuY2dDb21tYW5kIgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciCi0gICAgICAgICAgICBzZXF1ZW5jZT0iTTErNiIKLSAgICAgICAgICAgIHNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLSAgICAgIDwva2V5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnVpLm1haW4ubWVudT9hZnRlcj1hZGRpdGlvbnMiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSJTYW1wbGUgTWVudSIKLSAgICAgICAgICAgICAgIG1uZW1vbmljPSJNIgotICAgICAgICAgICAgICAgaWQ9ImNkdEFTVDIubWVudXMuc2FtcGxlTWVudSI+Ci0gICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJjZHRBU1QyLmNvbW1hbmRzLmNnQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgIGljb249Imljb25zL2dyYXBoVy5naWYiCi0gICAgICAgICAgICAgICAgICBpZD0iY2R0QVNUMi5tZW51cy5jZ0NvbW1hbmQiCi0gICAgICAgICAgICAgICAgICBsYWJlbD0iV2FsayBBU1QgdHJlZSIKLSAgICAgICAgICAgICAgICAgIG1uZW1vbmljPSJTIgotICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iV2FsayBBU1QgVHJlZSB0b29sdGlwIj4KLSAgICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgIDx0b29sYmFyCi0gICAgICAgICAgICAgICBpZD0iY2R0QVNUMi50b29sYmFycy5zYW1wbGVUb29sYmFyIj4KLSAgICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9ImNkdEFTVDIuY29tbWFuZHMuY2dDb21tYW5kIgotICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvY2FsbHNDLmdpZiIKLSAgICAgICAgICAgICAgICAgIGlkPSJjZHRBU1QyLnRvb2xiYXJzLmJ1aWxkQ2FsbEdyYXBoQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgIGxhYmVsPSJCdWlsZCBDYWxsIEdyYXBoIgotICAgICAgICAgICAgICAgICAgdG9vbHRpcD0iQnVpbGQgQ2FsbCBHcmFwaCI+Ci0gICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0iY2R0QVNUMi5jb21tYW5kcy5jZmdDb21tYW5kIgotICAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvY2FsbHNDRi5naWYiCi0gICAgICAgICAgICAgICAgICBpZD0iY2R0QVNUMi50b29sYmFycy5idWlsZENhbGxHcmFwaENvbW1hbmQiCi0gICAgICAgICAgICAgICAgICBsYWJlbD0iQnVpbGQgQ0ZHcmFwaCIKLSAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IkJ1aWxkIENvbnRyb2wgRmxvdyBHcmFwaCI+Ci0gICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICA8L3Rvb2xiYXI+Ci0gICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSJTYW1wbGUgQWN0aW9uIFNldCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0iY2R0QVNUMi5hY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IldhbGsgQVNUIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZ3JhcGhXLmdpZiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy5hY3Rpb25zLkFTVFdhbGtlckFjdGlvbiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IldhbGsgQVNUIHRvb2x0aXAiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ic2FtcGxlTWVudS9zYW1wbGVHcm91cCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJzYW1wbGVHcm91cCIKLSAgICAgICAgICAgICAgIGlkPSJjZHRhc3QyLmFjdGlvbnMuU2FtcGxlQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvSGVsbG8uYyBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy9IZWxsby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmUyODJiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy9IZWxsby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBNWVZBUiA0MgotCi1pbnQgZ3JhcGh0ZXN0KHZvaWQpIHsKLQlpbnQgYSxiOwotCWludCBwaT0zLjE0OwotCWE9MDsKLQliPU1ZVkFSOyAvLyB1c2UgZGVmaW5lZAotCWIgPSBiICsgYTsKLQlhPTMuMTQ7Ci0JcmV0dXJuIGI7Ci19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy9ncmFwaC5jIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL2dyYXBoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmMyYzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL2dyYXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jaW5jbHVkZSAibXBpLmgiCi0jaW5jbHVkZSAic3RkaW8uaCIKLSAKLXZvaWQgZm9vKGludCB4KTsKLXZvaWQgZ2VlKGludCB4KTsKLXZvaWQga2VpKGludCB4KTsKLQotdm9pZCBmb28oaW50IHgpewotICB4ICsrOwotICBnZWUoeCk7Ci19Ci0KLXZvaWQgZ2VlKGludCB4KXsKLSAgeCAqPSAzOwotICBrZWkoeCk7Ci19Ci0KLXZvaWQga2VpKGludCB4KXsKLSAgeCA9IHggJSAxMDsKLSAgZm9vKHgpOwotfQotCi12b2lkIGEoaW50IHgpewotICB4IC0tOwotfQotCi1pbnQgbWFpbjMoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSl7Ci0gIGludCB4ID0gMDsKLSAgZm9vKHgpOwotICBhKHgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy93YWxrYXN0LmMgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvd2Fsa2FzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRlYjg5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy93YWxrYXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLyBwMTYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBNWVZBUiA0MgotCi1pbnQgbWFpbih2b2lkKSB7Ci0JaW50IGEsYjsKLQlhPTA7Ci0JYj1NWVZBUjsgLy8gdXNlIGRlZmluZWQKLQliID0gYiArIGE7Ci0JcmV0dXJuIGI7Ci19Ci1pbnQgZm9vKGludCBiYXIpewotICBpbnQgeiA9IGJhcjsKLSAgcmV0dXJuIHo7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL3dhbGthc3RfZWRnZS5jIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL3dhbGthc3RfZWRnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE4MWI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc2FtcGxlcy93YWxrYXN0X2VkZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIGVkZ2UoaW50IGEpIHsKLQlpbnQgeCx5OwotCWlmKGE+MCkKLQkJeD0wOwotCWVsc2UgCi0JCXg9MTsKLQl5PXg7Ci19Ci1pbnQgZm9vKGludCBiYXIpewotICBpbnQgeiA9IGJhcjsKLSAgcmV0dXJuIHo7Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvd2Fsa2FzdF9lZGdlX2NvbW1lbnRzLmMgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NhbXBsZXMvd2Fsa2FzdF9lZGdlX2NvbW1lbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzAwZWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zYW1wbGVzL3dhbGthc3RfZWRnZV9jb21tZW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLy8jaW5jbHVkZSA8c3RkaW8uaD4KLS8qKiBmdW5jdGlvbiB0aGF0IHNob3dzIGEgc2hvcnQgZWRnZSBpbiBhIENGRyAqLwotdm9pZCBlZGdlKGludCBhKSB7Ci0JaW50IHgseTsKLQlpZihhPjApCi0JCXg9MDsgIC8vIHRoZSB0aGVuIGNhc2UKLQllbHNlIAotCQl4PTE7ICAvLyB0aGUgZWxzZSBjYXNlCi0JLy8gdXNlIHJlc3VsdGFudCB2YWx1ZSBvZiB4Ci0JLyogcGFydExpbmUgY29tbWVudCAqLyB5PXg7IAotfQotLyoqIHRoZSBldmVyLXByZXNlbnQgZm9vIGZ1bmN0aW9uICovCi1pbnQgZm9vKGludCBiYXIpewotICBpbnQgeiA9IGJhcjsKLSAgcmV0dXJuIHo7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvQWN0aXZhdG9yLmphdmEgYi90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNjBjYS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gImNkdEFTVDIiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9hY3Rpb25zL0FTVFdhbGtlckFjdGlvbi5qYXZhIGIvdG9vbHMvc2FtcGxlcy9vcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcHRwL3BsZHQvc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvYWN0aW9ucy9BU1RXYWxrZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzMjNiYy4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9hY3Rpb25zL0FTVFdhbGtlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RCaW5hcnlFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVENvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUQ29tcG91bmRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1ROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFByZXByb2Nlc3NvckluY2x1ZGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JQVNUUHJlcHJvY2Vzc29yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUuZG9tLmFzdC5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuY29yZS5kb20uYXN0LklBU1RUcmFuc2xhdGlvblVuaXQuSURlcGVuZGVuY3lUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFRyYW5zbGF0aW9uVW5pdC5JRGVwZW5kZW5jeVRyZWUuSUFTVEluY2x1c2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSUNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLm1vZGVsLklDRWxlbWVudFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY2R0LmNvcmUubW9kZWwuSVRyYW5zbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jZHQuaW50ZXJuYWwuY29yZS5kb20ucGFyc2VyLmMuQ0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBUaGlzIHdhcyBpbml0aWFsbHkgYnVpbHQgZnJvbSB0aGUgIlNhbXBsZSBBY3Rpb24iIHBsdWdpbiBleGFtcGxlLgotICogCi0gKiBUaGlzIHNhbXBsZSBhY3Rpb24gd2Fsa3MgYW4gQVNUIHRyZWUgZm9yIGEgc2VsZWN0ZWQgQyBzb3VyY2UgZmlsZS4KLSAqIFNlbGVjdCBhIEMgc291cmNlIGZpbGUgaW4gdGhlIFByb2plY3RzIHZpZXcgYW5kIGNsaWNrIHRoZSBpY29uIGluIHRoZSB0b29sYmFyCi0gKiB0byBwcmludCBBU1Qgd2Fsa2luZyBpbmZvcm1hdGlvbi4KLSAqIAotICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzIHRpYmJpdHRzQHVzLmlibS5jb20KLSAqLwotcHVibGljIGNsYXNzIEFTVFdhbGtlckFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQVNUV2Fsa2VyQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBhY3Rpb24gaGFzIGJlZW4gYWN0aXZhdGVkLiBUaGUgYXJndW1lbnQgb2YgdGhlIG1ldGhvZCByZXByZXNlbnRzIHRoZQotCSAqICdyZWFsJyBhY3Rpb24gc2l0dGluZyBpbiB0aGUgd29ya2JlbmNoIFVJLgotCSAqIAotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih3aW5kb3cuZ2V0U2hlbGwoKSwgIkNkdEFTVDIgUGx1Zy1pbiIsCi0JCQkJIlNlZSBDb25zb2xlIGZvciBBU1Qgd2Fsa2luZyByZXN1bHRzIik7Ci0JCXRyeSB7Ci0JCQlydW5TZWxlY3Rpb25FeGFtcGxlKHNlbGVjdGlvbik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBiZWVuIGNoYW5nZWQuIFdlIGNhbiBjaGFuZ2UgdGhlIHN0YXRlIG9mCi0JICogdGhlICdyZWFsJyBhY3Rpb24gaGVyZSBpZiB3ZSB3YW50LCBidXQgdGhpcyBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgdGhlCi0JICogZGVsZWdhdGUgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5TZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb249IiArIHNlbGVjdGlvbik7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJhbnNsYXRpb25Vbml0KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIElUcmFuc2xhdGlvblVuaXQiKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUNFbGVtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklDRWxlbWVudCIpOwotCQkJd2Fsa0lDRWxlbWVudCgoSUNFbGVtZW50KSBzZWxlY3Rpb24pOwotCi0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIGNvbnRlbnRzOiIpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gSXQgY2FuIGJlIGEgUHJvamVjdCwgRm9sZGVyLCBGaWxlLCBldGMuLi4KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCQlJQWRhcHRhYmxlIGlhZCA9IChJQWRhcHRhYmxlKSBvYmo7Ci0JCQkJCWZpbmFsIElSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBpYWQKLQkJCQkJCQkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IHJlc291cmNlOiAiICsgcmVzKTsKLQotCQkJCQkvLyBJQ0VsZW1lbnQgY292ZXJzIGZvbGRlcnMgYW5kIHRyYW5zbGF0aW9udW5pdHMKLQkJCQkJZmluYWwgSUNFbGVtZW50IGNlID0gKElDRWxlbWVudCkgaWFkCi0JCQkJCQkJLmdldEFkYXB0ZXIoSUNFbGVtZW50LmNsYXNzKTsvLyBjZHQ0MAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElDRWxlbWVudDogIiArIGNlKTsKLQotCQkJCQlJVHJhbnNsYXRpb25Vbml0IHR1ID0gKElUcmFuc2xhdGlvblVuaXQpIGlhZAotCQkJCQkJCS5nZXRBZGFwdGVyKElUcmFuc2xhdGlvblVuaXQuY2xhc3MpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElUcmFuc2xhdGlvblVuaXQ6ICIgKyB0dSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0RmxhdEluZm8odHUpOwotCQkJCQkJd2Fsa0lUVSh0dSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0vLyBlbmQgZm9yCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5TZWxlY3Rpb25FeGFtcGxlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBJdCBjYW4gYmUgYSBQcm9qZWN0LCBGb2xkZXIsIEZpbGUsIGV0Yy4uLgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJCUlBZGFwdGFibGUgaWFkID0gKElBZGFwdGFibGUpIG9iajsKLQkJCQkJZmluYWwgSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIGlhZAotCQkJCQkJCS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICBnb3QgcmVzb3VyY2U6ICIgKyByZXMpOwotCi0JCQkJCS8vIElDRWxlbWVudCBjb3ZlcnMgZm9sZGVycyBhbmQgdHJhbnNsYXRpb24gdW5pdHMKLQkJCQkJZmluYWwgSUNFbGVtZW50IGNlID0gKElDRWxlbWVudCkgaWFkCi0JCQkJCQkJLmdldEFkYXB0ZXIoSUNFbGVtZW50LmNsYXNzKTsvLyBjZHQ0MAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElDRWxlbWVudDogIiArIGNlKTsKLQotCQkJCQlJVHJhbnNsYXRpb25Vbml0IHR1ID0gKElUcmFuc2xhdGlvblVuaXQpIGlhZAotCQkJCQkJCS5nZXRBZGFwdGVyKElUcmFuc2xhdGlvblVuaXQuY2xhc3MpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgZ290IElUcmFuc2xhdGlvblVuaXQ6ICIgKyB0dSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT09bGlzdEZsYXRJbmZvKCk6Iik7Ci0JCQkJCWxpc3RGbGF0SW5mbyh0dSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT09d2Fsa0lUVSgpOiIpOwotCQkJCQl3YWxrSVRVKHR1KTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbj09PT09PT09PT13YWxrSVRVX0FTVCgpOiIpOwotCQkJCQl3YWxrSVRVX0FTVCh0dSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGRpc3Bvc2Ugb2YgYW55IHN5c3RlbSByZXNvdXJjZXMgd2UgcHJldmlvdXNseQotCSAqIGFsbG9jYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBXZSB3aWxsIGNhY2hlIHdpbmRvdyBvYmplY3QgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBwcm92aWRlIHBhcmVudCBzaGVsbAotCSAqIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cuCi0JICogCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JcHVibGljIHZvaWQgd2Fsa0lDRWxlbWVudChJQ0VsZW1lbnQgaWNlKSB7Ci0JCS8vIElDRWxlbWVudCBpY2UgPSAoSUNFbGVtZW50KXNlbGVjdGlvbjsKLQkJU3RyaW5nIGVOYW1lID0gaWNlLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSUNFbGVtZW50IG5hbWU6ICIgKyBlTmFtZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBXYWxrIHRoZSBJVHJhbnNsYXRpb25Vbml0IHdpdGggYSB2aXNpdG9yLCB3aGljaCAob25seSkgdmlzaXRzIElDRWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gdHUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgd2Fsa0lUVShJVHJhbnNsYXRpb25Vbml0IHR1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0dU5hbWUgPSB0dS5nZXRFbGVtZW50TmFtZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIklUcmFuc2xhdGlvblVuaXQgbmFtZTogIiArIHR1TmFtZSk7Ci0JCXR1LmFjY2VwdChuZXcgSUNFbGVtZW50VmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElDRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nOiAiICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCQlyZXR1cm4gdmlzaXRDaGlsZHJlbjsKLQkJCX0KLQkJfSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVNUIHZpc2l0b3IgZm9yICIgKyB0dU5hbWUpOwotCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVCgpOwotCQlhc3QuYWNjZXB0KG5ldyBNeUFTVFZpc2l0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogV2FsayB0aGUgSUFTVFRyYW5zbGF0aW9uVW5pdCdzIEFTVCB0cmVlLCB3aGljaCBjYW4gdmlzaXQgbWFueSB0eXBlcyBvZgotCSAqIG5vZGVzCi0JICogCi0JICogQHBhcmFtIHR1Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhbGtJVFVfQVNUKElUcmFuc2xhdGlvblVuaXQgdHUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBU1QgdmlzaXRvciBmb3IgIiArIHR1LmdldEVsZW1lbnROYW1lKCkpOwotCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVCgpOwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIlxuPT09PT09PT09PT09PT09PT1NeUFTVFZpc2l0b3IyIGFsc28gaW1wbGVtZW50cyBsZWF2ZSgpIFxuIik7Ci0JCWFzdC5hY2NlcHQobmV3IE15QVNUVmlzaXRvcjIoKSk7Ci0JfQotCi0JY2xhc3MgTXlBU1RWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0KLQkJTXlBU1RWaXNpdG9yKCkgewotCQkJdGhpcy5zaG91bGRWaXNpdFN0YXRlbWVudHMgPSB0cnVlOyAvLyBsb3RzIG1vcmUKLQkJCXRoaXMuc2hvdWxkVmlzaXREZWNsYXJhdGlvbnMgPSB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGludCB2aXNpdChJQVNUU3RhdGVtZW50IHN0bXQpIHsgLy8gbG90cyBtb3JlCi0JCQlTdHJpbmcgc2lnID0gc3RtdC5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCWlmIChzaWcubGVuZ3RoKCkgPiAwKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgc3RtdDogIiArIHN0bXQuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJZWxzZSBpZiAoc3RtdCBpbnN0YW5jZW9mIElBU1RDb21wb3VuZFN0YXRlbWVudCkgewotCQkJCUlBU1RDb21wb3VuZFN0YXRlbWVudCBjc3RtdCA9IChJQVNUQ29tcG91bmRTdGF0ZW1lbnQpIHN0bXQ7Ci0JCQkJSUFTVFN0YXRlbWVudFtdIHN0bXRzID0gY3N0bXQuZ2V0U3RhdGVtZW50cygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgY29tcG91bmQgc3RtdCB3aXRoIHN0bXRzOiAiCi0JCQkJCQkrIHN0bXRzLmxlbmd0aCk7Ci0JCQkJZm9yIChJQVNUU3RhdGVtZW50IHN0IDogc3RtdHMpIHsKLQkJCQkJU3RyaW5nIHJhd1NpZyA9IHN0LmdldFJhd1NpZ25hdHVyZSgpOwotCi0JCQkJCWlmIChyYXdTaWcubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAtPiIgKyBzdCk7Ci0JCQkJCQlpZiAoc3QgaW5zdGFuY2VvZiBDQVNURXhwcmVzc2lvblN0YXRlbWVudCkgewotCQkJCQkJCUNBU1RFeHByZXNzaW9uU3RhdGVtZW50IGVzID0gKENBU1RFeHByZXNzaW9uU3RhdGVtZW50KSBzdDsKLQkJCQkJCQlJQVNURXhwcmVzc2lvbiBleHAgPSBlcy5nZXRFeHByZXNzaW9uKCk7Ci0JCQkJCQkJaWYgKGV4cCBpbnN0YW5jZW9mIElBU1RCaW5hcnlFeHByZXNzaW9uKSB7Ci0JCQkJCQkJCUlBU1RCaW5hcnlFeHByZXNzaW9uIGJleHAgPSAoSUFTVEJpbmFyeUV4cHJlc3Npb24pIGV4cDsKLQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBiaW5hcnkgZXhwOiAiCi0JCQkJCQkJCQkJKyBiZXhwLmdldE9wZXJhbmQxKCkgKyAiICIKLQkJCQkJCQkJCQkrIGJleHAuZ2V0T3BlcmF0b3IoKSArICIgIgotCQkJCQkJCQkJCSsgYmV4cC5nZXRPcGVyYW5kMigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIGV4cFN0ciA9IGV4cC5nZXRSYXdTaWduYXR1cmUoKTsKLQkJCQkJCQlJVHlwZSB0eXBlID0gZXhwLmdldEV4cHJlc3Npb25UeXBlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC0+IiArIHJhd1NpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgdmlzaXQoSUFTVERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgZGVjbDogIiArIGRlY2wuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCX0KLQotCi0JLyoqIFZpc2l0b3IgdGhhdCB1c2VzIGxlYXZlKCkgdG8gc2hvdyBuZXN0aW5nICovCi0JY2xhc3MgTXlBU1RWaXNpdG9yMiBleHRlbmRzIEFTVFZpc2l0b3IgewotCi0JCU15QVNUVmlzaXRvcjIoKSB7Ci0JCQl0aGlzLnNob3VsZFZpc2l0U3RhdGVtZW50cyA9IHRydWU7Ci0JCQl0aGlzLnNob3VsZFZpc2l0RGVjbGFyYXRpb25zID0gdHJ1ZTsKLQkJCXRoaXMuc2hvdWxkVmlzaXROYW1lcyA9IHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogUHJpbnQgc3RhdGVtZW50IGluZm86IGlmIGFsdGVyZWQgYnkgcHJlcHJvY2Vzc29yLCB0aGVuCi0JCSAqIGdldFJhd1NpZ25hdHVyZSgpIGlzIGVtcHR5OyB1c2UgYWx0ZXJuYXRlIHJlcHJlc2VudGF0aW9uCi0JCSAqLwotCQlwdWJsaWMgaW50IHZpc2l0KElBU1RTdGF0ZW1lbnQgc3RtdCkgewotCQkJU3RyaW5nIHNpZyA9IHN0bXQuZ2V0UmF3U2lnbmF0dXJlKCk7Ci0JCQlpZiAoc2lnLmxlbmd0aCgpID4gMCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nIHN0bXQ6ICIgKyBzdG10LmdldFJhd1NpZ25hdHVyZSgpKTsKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nIHN0bXQ6ICIgKyBzdG10LnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHZpc2l0KElBU1REZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlZpc2l0aW5nIGRlY2w6ICIgKyBkZWNsLmdldFJhd1NpZ25hdHVyZSgpKTsKLQkJCXJldHVybiBQUk9DRVNTX0NPTlRJTlVFOwotCQl9Ci0KLQkJcHVibGljIGludCB2aXNpdChJQVNUTmFtZSBuYW1lKSB7Ci0JCQlTdHJpbmcgcHJ0TmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKLQkJCWlmIChwcnROYW1lLmxlbmd0aCgpID09IDApCi0JCQkJcHJ0TmFtZSA9IG5hbWUuZ2V0UmF3U2lnbmF0dXJlKCk7IC8vIHVzZSBwcmUgcHJlLXByb2Nlc3NvcgotCQkJLy8gdmFsdWUKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVmlzaXRpbmcgbmFtZTogIiArIHBydE5hbWUpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlYXZlKElBU1RTdGF0ZW1lbnQgc3RtdCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgTGVhdmluZyBzdG10OiAiICsgc3RtdC5nZXRSYXdTaWduYXR1cmUoKSk7Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbGVhdmUoSUFTVERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIExlYXZpbmcgZGVjbDogIiArIGRlY2wuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJcmV0dXJuIFBST0NFU1NfQ09OVElOVUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGxlYXZlKElBU1ROYW1lIG5hbWUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIExlYXZpbmcgbmFtZTogIiArIG5hbWUpOy8vIHBvc3NpYmx5IGVtcHR5Ci0JCQlyZXR1cm4gUFJPQ0VTU19DT05USU5VRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3QgImZsYXQgaW5mbyIgdHlwZSBxdWVyaWVzIHRoYXQgcmV0dXJuIGxpc3RzIG9mIHRoaW5ncyBvbiB0aGUgYXN0Ci0JICogCi0JICogQHBhcmFtIHR1Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jdm9pZCBsaXN0RmxhdEluZm8oSVRyYW5zbGF0aW9uVW5pdCB0dSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQVNUVHJhbnNsYXRpb25Vbml0IGFzdCA9IHR1LmdldEFTVCgpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQVNUIGZvcjogIiArIGFzdC5nZXRDb250YWluaW5nRmlsZW5hbWUoKSk7Ci0KLQkJSUFTVFByZXByb2Nlc3NvclN0YXRlbWVudFtdIHBwc3MgPSBhc3QuZ2V0QWxsUHJlcHJvY2Vzc29yU3RhdGVtZW50cygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXByb2Nlc3NvclN0bXRzOiAob21pdCAvdXNyLy4uLikiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcHNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQVNUUHJlcHJvY2Vzc29yU3RhdGVtZW50IHBwcyA9IHBwc3NbaV07Ci0JCQlTdHJpbmcgZm4gPSBwcHMuZ2V0Q29udGFpbmluZ0ZpbGVuYW1lKCk7Ci0JCQlpZiAoIWZuLnN0YXJ0c1dpdGgoIi91c3IiKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIiAgUHJlcHJvY2Vzc29yU3RtdDogIiArIGxhc3RwYXJ0KGZuKQotCQkJCQkJKyAiICIgKyBwcHMuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJfQotCQl9Ci0JCUlBU1REZWNsYXJhdGlvbltdIGRlY2xzID0gYXN0LmdldERlY2xhcmF0aW9ucygpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlY2xhcmF0aW9uczogKG9taXQgL3Vzci8uLi4pIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVjbHMubGVuZ3RoOyBpKyspIHsKLQkJCUlBU1REZWNsYXJhdGlvbiBkZWNsID0gZGVjbHNbaV07Ci0JCQlTdHJpbmcgZm4gPSBkZWNsLmdldENvbnRhaW5pbmdGaWxlbmFtZSgpOwotCQkJaWYgKCFmbi5zdGFydHNXaXRoKCIvdXNyIikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaSArICIgIERlY2xhcmF0aW9uOiAiICsgbGFzdHBhcnQoZm4pICsgIiAiCi0JCQkJCQkrIGRlY2wuZ2V0UmF3U2lnbmF0dXJlKCkpOwotCQkJfQotCQl9Ci0JCUlBU1RQcmVwcm9jZXNzb3JTdGF0ZW1lbnRbXSBpZGlycyA9IGFzdC5nZXRJbmNsdWRlRGlyZWN0aXZlcygpOwotCQkvLyByZWN1cnNlcyB0aHJ1IGluY2x1ZGVzIGluY2x1ZGVkIGJ5IG90aGVyIGluY2x1ZGVzLi4uCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW5jbHVkZSBkaXJlY3RpdmVzOiAiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZGlycy5sZW5ndGg7IGkrKykgewotCQkJSUFTVFByZXByb2Nlc3NvclN0YXRlbWVudCBpZGlyID0gaWRpcnNbaV07Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaSArICIgaW5jbHVkZSBkaXJlY3RpdmU6ICIgKyBpZGlyKTsKLQotCQl9Ci0KLQkJSURlcGVuZGVuY3lUcmVlIGR0ID0gYXN0LmdldERlcGVuZGVuY3lUcmVlKCk7Ci0JCUlBU1RJbmNsdXNpb25Ob2RlW10gaW5zID0gZHQuZ2V0SW5jbHVzaW9ucygpOwotCQkvLyB0aGlzIGxpc3RzIG9ubHkgdGhlIGluY2x1ZGVzIGltbWVkaWF0ZWx5IGluY2x1ZGVkIGJ5IHRoaXMgc3JjIGZpbGUKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXBlbmRlbmN5IHRyZWUvSW5jbHVkZSBzdGF0ZW1lbnRzOiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlucy5sZW5ndGg7IGkrKykgewotCQkJSUFTVEluY2x1c2lvbk5vZGUgaW4gPSBpbnNbaV07Ci0JCQlJQVNUUHJlcHJvY2Vzc29ySW5jbHVkZVN0YXRlbWVudCBpcyA9IGluLmdldEluY2x1ZGVEaXJlY3RpdmUoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIiAgaW5jbHVkZSBzdG10OiAiICsgaXMpOwotCQl9Ci0JCS8vIG5vdGU6IGNvbW1lbnRzIGFyZSBub3QgYXZhaWxhYmxlIGFzIEFTVCBOb2RlcyBidXQgYXJlIGF2YWlsYWJsZSBoZXJlLgotCQkvLyAoSW4gc3BpdGUgb2YgdGhlIGV4aXN0ZW5jZSBvZiBJQVNUQ29tbWVudCBjbGFzcyBhbmQgdmlzaXQoSUFTVENvbW1lbnQpIG1ldGhvZC4pCi0JCS8vIFRoZXNlIGFyZSBkZXByZWNhdGVkIGluIENEVCA1LjAKLQkJYXN0ID0gdHUuZ2V0QVNUKG51bGwsSVRyYW5zbGF0aW9uVW5pdC5BU1RfQ1JFQVRFX0NPTU1FTlRfTk9ERVMpOwotCQlJQVNUQ29tbWVudFtdIGNtdHMgPSBhc3QuZ2V0Q29tbWVudHMoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21tZW50cyBmb3VuZDogIitjbXRzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY210cy5sZW5ndGg7IGkrKykgewotCQkJSUFTVENvbW1lbnQgY29tbWVudCA9IGNtdHNbaV07Ci0JCQljaGFyW10gY210Q2hhcj1jb21tZW50LmdldENvbW1lbnQoKTsKLQkJCVN0cmluZyBjbXRTdHI9U3RyaW5nLnZhbHVlT2YoY210Q2hhcik7Ci0JCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIiBDb21tZW50OiBbIiArIGNtdFN0ciArICJdIHJhd1NpZzogWyIrY29tbWVudC5nZXRSYXdTaWduYXR1cmUoKSsiXSBsaW5lICIKLQkJCQkJKyBjb21tZW50LmdldEZpbGVMb2NhdGlvbigpKTsKLQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGFzdCBwYXJ0IG9mIHN0cmluZyBwYXRobmFtZTogZS5nLiBhL2IvYy9mb28uYyByZXR1cm5zIGZvby5jCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBsYXN0cGFydChTdHJpbmcgcGF0aG5hbWUpIHsKLQkJaW50IGxvYyA9IHBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCXJldHVybiBwYXRobmFtZS5zdWJzdHJpbmcobG9jICsgMSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ0ZHcmFwaEhhbmRsZXIuamF2YSBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ0ZHcmFwaEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0YWQ4ZS4uMDAwMDAwMAotLS0gYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9oYW5kbGVycy9CdWlsZENGR3JhcGhIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNkdC5jb3JlLmRvbS5hc3QuSUFTVFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuR3JhcGhDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklCbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5JQ2FsbEdyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDb250cm9sRmxvd0dyYXBoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLmltcGwuQ29udHJvbEZsb3dHcmFwaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotLyoqCi0gKiBCdWlsZCBDb250cm9sIEZsb3cgR3JhcGgKLSAqIAotICogQGF1dGhvciBCZXRoIFRpYmJpdHRzICB0aWJiaXR0c0B1cy5pYm0uY29tCi0gKiAgCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuR3JhcGhDcmVhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZENGR3JhcGhIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSUNhbGxHcmFwaCBjYWxsR3JhcGg7Ci0JcHJvdGVjdGVkIEdyYXBoQ3JlYXRvciBncmFwaENyZWF0b3I7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBCdWlsZENGR3JhcGhIYW5kbGVyKCkgewotCQlncmFwaENyZWF0b3IgPSBuZXcgR3JhcGhDcmVhdG9yKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kOiBleHRyYWN0IGV4dHJhY3QgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNvbnRleHQuIDxicj4KLQkgKiBBIG5ldyBjYWxsIGdyYXBoIGlzIGNvbnN0cnVjdGVkIGZvciB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBieSBJSGFuZGxlcgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXZlbnQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkQ0ZHcmFwaEhhbmRsZXIuZXhlY3V0ZSgpIik7Ci0JCS8vIGNyZWF0ZSBhbiBlbXB0eSBjYWxsIGdyYXBoIHRvIGJlZ2luIHdpdGgKLQkJY2FsbEdyYXBoID0gZ3JhcGhDcmVhdG9yLmluaXRDYWxsR3JhcGgoKTsKLQkJLy8gR2V0IHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihldmVudCk7Ci0JCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCW1lc3NhZ2UoIk5vIHNlbGVjdGlvbiBkZXRlY3RlZC4gUGxlYXNlIHNlbGVjdCBhIGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdCBpbiB0aGUgUHJvamVjdHMgVmlldy4iKTsKLQkJCQlzZWxlY3Rpb249bnVsbDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIFdlIGl0ZXJhdGUgaGVyZSBvbmx5IHRvIGhhbmRsZSB0aGUgcG9zc2liaWxpdHkgb2YgbXVsdGlwbGUtc2VsZWN0aW9uLgotCQkvLyBncmFwaENyZWF0b3Igd2lsbCBkZXNjZW5kIGludG8gY2hpbGQgbm9kZXMuCi0JCS8qZmluYWwqLyBJUmVzb3VyY2UgcmVzPW51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCS8vIEl0IGNhbiBiZSBhIFByb2plY3QsIEZvbGRlciwgRmlsZSwgZXRjLi4uCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCUlBZGFwdGFibGUgaWFkID0gKElBZGFwdGFibGUpIG9iajsKLQkJCQlyZXMgPSAoSVJlc291cmNlKSBpYWQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCS8vIE5vdGU6IHB1dCB0aGlzIGluIGEgSm9iIG9yIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBpZiByZXNvdXJjZXMKLQkJCQkvLyB3aWxsIGJlIGNoYW5nZWQuCi0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCWNhbGxHcmFwaCA9IGdyYXBoQ3JlYXRvci5pbml0Q2FsbEdyYXBoKHJlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVzc2FnZSgiUGxlYXNlIHNlbGVjdCBhIGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdCBpbiB0aGUgUHJvamVjdHMgdmlldyIpOwotCQkJCQlzZWxlY3Rpb249bnVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZ3JhcGhDcmVhdG9yLmNvbXB1dGVDYWxsR3JhcGgoY2FsbEdyYXBoKTsKLQkJLy8gZ2V0IHRoZSBmaXJzdCBub2RlCi0JCUlDYWxsR3JhcGhOb2RlIHRvcE5vZGUgPSBjYWxsR3JhcGgudG9wRW50cnkoKTsKLQkJU3RyaW5nIHRvcE5hbWU9dG9wTm9kZS5nZXRGdW5jTmFtZSgpOwotCQkKLQkJSUNhbGxHcmFwaE5vZGUgZmlyc3ROb2RlPWNhbGxHcmFwaC5nZXRBbGxOb2RlcygpLmdldCgwKTsKLQkJU3RyaW5nIGZpcnN0TmFtZT1maXJzdE5vZGUuZ2V0RnVuY05hbWUoKTsKLQkJLy8gZ2V0IGEgbm9kZSBieSBmdW5jdGlvbiBuYW1lCi0JCUlDYWxsR3JhcGhOb2RlIG5hbWVkTm9kZSA9IGNhbGxHcmFwaC5nZXROb2RlKHJlcy5nZXROYW1lKCksICJmb28iKTsKLQkJU3RyaW5nIG5hbWVkTmFtZT0iIjsKLQkJaWYobmFtZWROb2RlIT1udWxsKSB7Ci0JCQluYW1lZE5hbWU9bmFtZWROb2RlLmdldEZ1bmNOYW1lKCk7Ci0JCX0KLQkJCi0JCUlDYWxsR3JhcGhOb2RlIG5vZGUgPSB0b3BOb2RlOwotCQlJQVNUU3RhdGVtZW50IGZ1bmNCb2R5PW5vZGUuZ2V0RnVuY0RlZigpLmdldEJvZHkoKTsKLQkJSUNvbnRyb2xGbG93R3JhcGggY2ZnID0gbmV3IENvbnRyb2xGbG93R3JhcGgoZnVuY0JvZHkpOwotCQljZmcuYnVpbGRDRkcoKTsKLQkJCi0JCUlCbG9jayBlbnRyeUJsb2NrID0gY2ZnLmdldEVudHJ5KCk7Ci0JCWZvciAoSUJsb2NrIGJsb2NrPSBjZmcuZ2V0RW50cnkoKTsgYmxvY2shPW51bGw7IGJsb2NrID0gYmxvY2suZ2V0VG9wTmV4dCgpKSB7Ci0JCQlibG9jay5wcmludCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZENhbGxHcmFwaEhhbmRsZXIgZ290IHNlbGVjdGlvbiIpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24od2luZG93LmdldFNoZWxsKCksCi0JCQkJIkhvdXN0b24sIHdlIGhhdmUgYSBwcm9ibGVtIiwgbXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9zYW1wbGVzL29yZy5lY2xpcHNlLnB0cC5wbGR0LnNhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wdHAvcGxkdC9zYW1wbGVDRFRzdGF0aWNBbmFseXNpcy9oYW5kbGVycy9CdWlsZENhbGxHcmFwaEhhbmRsZXIuamF2YSBiL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ2FsbEdyYXBoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWM2ODYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NhbXBsZXMvb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3B0cC9wbGR0L3NhbXBsZUNEVHN0YXRpY0FuYWx5c2lzL2hhbmRsZXJzL0J1aWxkQ2FsbEdyYXBoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UucHRwLnBsZHQuc2FtcGxlQ0RUc3RhdGljQW5hbHlzaXMuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucHRwLnBsZHQubXBpLmFuYWx5c2lzLmNkdC5ncmFwaHMuR3JhcGhDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnB0cC5wbGR0Lm1waS5hbmFseXNpcy5jZHQuZ3JhcGhzLklDYWxsR3JhcGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLS8qKgotICogVGhpcyBoYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyLCBhbiBJSGFuZGxlciBiYXNlIGNsYXNzLiBUaGlzIGhhbmRsZXIKLSAqIGJ1aWxkcyBhIGNhbGwgZ3JhcGggZm9yIHRoZSBzZWxlY3RlZCByZXNvdXJjZShzKSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LiA8YnI+Ci0gKiAKLSAqIFR3byBzdGVwcyB0byBidWlsZGluZyBjYWxsIGdyYXBoOiA8YnI+Ci0gKiAxLiBjb2xsZWN0IGFsbCBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbiB0aGUgY2FsbCBncmFwaCA8YnI+Ci0gKiAyLiBjb25zdHJ1Y3QgdGhlIGNhbGxlciBhbmQgY2FsbGVlIHJlbGF0aW9uc2hpcCBhbW9uZyB0aGUgQ2FsbEdyYXBoTm9kZXMKLSAqIDxicj5Nb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgYnkgR3JhcGhDcmVhdG9yCi0gKiAKLSAqIEBhdXRob3IgQmV0aCBUaWJiaXR0cyB0aWJiaXR0c0B1cy5pYm0uY29tCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcgotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcgotICogQHNlZSBvcmcuZWNsaXBzZS5wdHAucGxkdC5tcGkuYW5hbHlzaXMuY2R0LmdyYXBocy5HcmFwaENyZWF0b3IKLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkQ2FsbEdyYXBoSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIElDYWxsR3JhcGggY2FsbEdyYXBoOwotCXByb3RlY3RlZCBHcmFwaENyZWF0b3IgZ3JhcGhDcmVhdG9yOwotCXByb3RlY3RlZCBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQnVpbGRDYWxsR3JhcGhIYW5kbGVyKCkgewotCQlncmFwaENyZWF0b3IgPSBuZXcgR3JhcGhDcmVhdG9yKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kOiBleHRyYWN0IGV4dHJhY3QgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCSAqIGFwcGxpY2F0aW9uIGNvbnRleHQuIDxicj4KLQkgKiBBIG5ldyBjYWxsIGdyYXBoIGlzIGNvbnN0cnVjdGVkIGZvciB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBieSBJSGFuZGxlcgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXZlbnQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWxkQ2FsbEdyYXBoSGFuZGxlci5leGVjdXRlKCkiKTsKLQkJLy8gY3JlYXRlIGFuIGVtcHR5IGNhbGwgZ3JhcGggdG8gYmVnaW4gd2l0aAotCQljYWxsR3JhcGggPSBncmFwaENyZWF0b3IuaW5pdENhbGxHcmFwaCgpOwotCQkvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJSVNlbGVjdGlvbiBzZWwgPSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uKGV2ZW50KTsKLQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQkJfQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZSgiTm8gc2VsZWN0aW9uIGRldGVjdGVkLiBQbGVhc2Ugc2VsZWN0IGEgZmlsZSwgZm9sZGVyLCBvciBwcm9qZWN0IGluIHRoZSBQcm9qZWN0cyBWaWV3LiIpOwotCQkJCXNlbGVjdGlvbj1udWxsOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gV2UgaXRlcmF0ZSBoZXJlIG9ubHkgdG8gaGFuZGxlIHRoZSBwb3NzaWJpbGl0eSBvZiBtdWx0aXBsZS1zZWxlY3Rpb24uCi0JCS8vIGdyYXBoQ3JlYXRvciB3aWxsIGRlc2NlbmQgaW50byBjaGlsZCBub2Rlcy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJLy8gSXQgY2FuIGJlIGEgUHJvamVjdCwgRm9sZGVyLCBGaWxlLCBldGMuLi4KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQkJSUFkYXB0YWJsZSBpYWQgPSAoSUFkYXB0YWJsZSkgb2JqOwotCQkJCWZpbmFsIElSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBpYWQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJCS8vIE5vdGU6IHB1dCB0aGlzIGluIGEgSm9iIG9yIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBpZiByZXNvdXJjZXMKLQkJCQkvLyB3aWxsIGJlIGNoYW5nZWQuCi0JCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCWNhbGxHcmFwaCA9IGdyYXBoQ3JlYXRvci5pbml0Q2FsbEdyYXBoKHJlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVzc2FnZSgiUGxlYXNlIHNlbGVjdCBhIGZpbGUsIGZvbGRlciwgb3IgcHJvamVjdCBpbiB0aGUgUHJvamVjdHMgdmlldyIpOwotCQkJCQlzZWxlY3Rpb249bnVsbDsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb3VyY2VzIHNjYW5uZWQuIE5vdyBzZWFyY2ggZm9yIGNhbGxlcnMvY2FsbGVlcyIpOwotCQlncmFwaENyZWF0b3IuY29tcHV0ZUNhbGxHcmFwaChjYWxsR3JhcGgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oInNob3dDYWxsR3JhcGguLi4iKTsKLQkJZ3JhcGhDcmVhdG9yLnNob3dDYWxsR3JhcGgoY2FsbEdyYXBoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJzaG93Q2FsbEdyYXBoIGNvbXBsZXRlLiIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJdGhpcy5zZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRDYWxsR3JhcGhIYW5kbGVyIGdvdCBzZWxlY3Rpb24iKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgbWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHdpbmRvdy5nZXRTaGVsbCgpLAotCQkJCSJIb3VzdG9uLCB3ZSBoYXZlIGEgcHJvYmxlbSIsIG1zZyk7Ci0JfQotfQo=